xref: /netbsd-src/sys/dev/usb/umidi_quirks.h (revision 4e8e66439e246961c4367c78584be80e23f52897)
1 /*	$NetBSD: umidi_quirks.h,v 1.9 2016/04/23 10:15:32 skrll Exp $	*/
2 
3 /*
4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Takuya SHIOZAKI (tshiozak@NetBSD.org).
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 
33 /*
34  * quirk code for UMIDI
35  */
36 
37 #ifndef _DEV_USB_UMIDI_QUIRKS_H_
38 #define _DEV_USB_UMIDI_QUIRKS_H_
39 
40 struct umq_data {
41 	int		type;
42 #define UMQ_TYPE_NONE		0
43 #define UMQ_TYPE_FIXED_EP	1
44 #define UMQ_TYPE_YAMAHA		2
45 #define UMQ_TYPE_MIDIMAN_GARBLE	3
46 #define UMQ_TYPE_CN_SEQ_PER_EP  4 /* should be default behavior, but isn't */
47 #define UMQ_TYPE_CN_SEQ_GLOBAL	5 /* shouldn't be default behavior, but is */
48 #define UMQ_TYPE_CN_FIXED       6 /* should be a joke, but isn't funny */
49 #define UMQ_TYPE_MD_FIXED       7 /* in case CN_FIXED gives a weird order */
50 	const void	*data;
51 };
52 
53 struct umidi_quirk {
54 	int			vendor;
55 	int			product;
56 	int			iface;
57 	const struct umq_data	*quirks;
58 	uint32_t		type_mask;
59 };
60 #define UMQ_ISTYPE(q, type) \
61 	((q)->sc_quirk && ((q)->sc_quirk->type_mask & (1<<((type)-1))))
62 
63 #define UMQ_TERMINATOR { .type = UMQ_TYPE_NONE, },
64 #define UMQ_DEF(v, p, i)					\
65 static const struct umq_data	umq_##v##_##p##_##i[]
66 #define UMQ_REG(v, p, i)					\
67 	{ USB_VENDOR_##v, USB_PRODUCT_##p, i,			\
68 	  umq_##v##_##p##_##i, 0 }
69 #define ANYIFACE			-1
70 #define ANYVENDOR			-1
71 #define USB_VENDOR_ANYVENDOR		ANYVENDOR
72 #define ANYPRODUCT			-1
73 #define USB_PRODUCT_ANYPRODUCT		ANYPRODUCT
74 
75 /*
76  * quirk - fixed port. By the way, the ep field contains not the
77  * endpoint address, but the index of the endpoint descriptor.
78  */
79 
80 struct umq_fixed_ep_endpoint {
81 	int	ep;
82 	int	num_jacks;
83 };
84 struct umq_fixed_ep_desc {
85 	int					num_out_ep;
86 	int					num_in_ep;
87 	const struct umq_fixed_ep_endpoint	*out_ep;
88 	const struct umq_fixed_ep_endpoint	*in_ep;
89 };
90 
91 #define UMQ_FIXED_EP_DATA_DEF(v, p, i, noep, niep)			\
92 static const struct umq_fixed_ep_endpoint				\
93 umq_##v##_##p##_##i##_fixed_ep_endpoints[noep+niep]
94 
95 #define UMQ_FIXED_EP_DEF(v, p, i, noep, niep)				\
96 static const struct umq_fixed_ep_desc					\
97 umq_##v##_##p##_##i##_fixed_ep_desc = {					\
98 	noep, niep,							\
99 	&umq_##v##_##p##_##i##_fixed_ep_endpoints[0],			\
100 	&umq_##v##_##p##_##i##_fixed_ep_endpoints[noep],		\
101 };									\
102 
103 #define UMQ_FIXED_EP_REG(v, p, i)					\
104 { UMQ_TYPE_FIXED_EP, &umq_##v##_##p##_##i##_fixed_ep_desc }
105 
106 /*
107  * quirk - fixed cable numbers. Supply as many values as there are jacks,
108  * in the same jack order implied by the FIXED_EP_DEF. Each value becomes
109  * the cable number of the corresponding jack.
110  */
111 #define UMQ_FIXED_CN_DEF(v, p, i)					\
112 static const unsigned char umq_##v##_##p##_##i##_fixed_cn_desc[]
113 #define UMQ_FIXED_CN_REG(v, p, i)					\
114 { UMQ_TYPE_CN_FIXED, &umq_##v##_##p##_##i##_fixed_cn_desc }
115 
116 /*
117  * quirk - fixed mididev assignment. Supply pairs of numbers out, in, as
118  * many pairs as mididevs (that is, max(num_out_jack,num_in_jack)). The
119  * pairs, in order, correspond to the mididevs that will be created; in
120  * each pair, out is the index of the out_jack to bind and in is the
121  * index of the in_jack, both in the order implied by the FIXED_EP_DEF.
122  * Either out or in can be -1 to bind no out jack or in jack, respectively,
123  * to the corresponding mididev.
124  */
125 #define UMQ_FIXED_MD_DEF(v, p, i)					\
126 static const unsigned char umq_##v##_##p##_##i##_fixed_md_desc[]
127 #define UMQ_FIXED_MD_REG(v, p, i)					\
128 { UMQ_TYPE_MD_FIXED, &umq_##v##_##p##_##i##_fixed_md_desc }
129 
130 /*
131  * generic boolean quirk, no data
132  */
133 #define UMQ_TYPE(t)							\
134 { UMQ_TYPE_##t, NULL }
135 
136 /*
137  * quirk - yamaha style midi I/F
138  */
139 #define UMQ_YAMAHA_REG(v, p, i)						\
140 UMQ_TYPE(YAMAHA)
141 
142 
143 /* extern const struct umidi_quirk umidi_quirklist[]; */
144 const struct umidi_quirk *umidi_search_quirk(int, int, int);
145 void umidi_print_quirk(const struct umidi_quirk *);
146 const void *umidi_get_quirk_data_from_type(const struct umidi_quirk *, uint32_t);
147 
148 #endif
149