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