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