Home | History | Annotate | Line # | Download | only in usb
umidi_quirks.c revision 1.20
      1  1.20     skrll /*	$NetBSD: umidi_quirks.c,v 1.20 2016/04/23 10:15:32 skrll Exp $	*/
      2   1.1  tshiozak 
      3   1.1  tshiozak /*
      4   1.1  tshiozak  * Copyright (c) 2001 The NetBSD Foundation, Inc.
      5   1.1  tshiozak  * All rights reserved.
      6   1.1  tshiozak  *
      7   1.1  tshiozak  * This code is derived from software contributed to The NetBSD Foundation
      8   1.6    keihan  * by Takuya SHIOZAKI (tshiozak (at) NetBSD.org).
      9   1.1  tshiozak  *
     10   1.1  tshiozak  * Redistribution and use in source and binary forms, with or without
     11   1.1  tshiozak  * modification, are permitted provided that the following conditions
     12   1.1  tshiozak  * are met:
     13   1.1  tshiozak  * 1. Redistributions of source code must retain the above copyright
     14   1.1  tshiozak  *    notice, this list of conditions and the following disclaimer.
     15   1.1  tshiozak  * 2. Redistributions in binary form must reproduce the above copyright
     16   1.1  tshiozak  *    notice, this list of conditions and the following disclaimer in the
     17   1.1  tshiozak  *    documentation and/or other materials provided with the distribution.
     18   1.1  tshiozak  *
     19   1.1  tshiozak  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20   1.1  tshiozak  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21   1.1  tshiozak  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22   1.1  tshiozak  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23   1.1  tshiozak  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24   1.1  tshiozak  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25   1.1  tshiozak  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26   1.1  tshiozak  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27   1.1  tshiozak  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28   1.1  tshiozak  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29   1.1  tshiozak  * POSSIBILITY OF SUCH DAMAGE.
     30   1.1  tshiozak  */
     31   1.1  tshiozak 
     32   1.3     lukem #include <sys/cdefs.h>
     33  1.20     skrll __KERNEL_RCSID(0, "$NetBSD: umidi_quirks.c,v 1.20 2016/04/23 10:15:32 skrll Exp $");
     34   1.1  tshiozak 
     35   1.1  tshiozak #include <sys/param.h>
     36   1.1  tshiozak #include <sys/systm.h>
     37   1.1  tshiozak #include <sys/kernel.h>
     38   1.1  tshiozak #include <sys/device.h>
     39   1.1  tshiozak #include <sys/ioctl.h>
     40   1.1  tshiozak #include <sys/conf.h>
     41   1.1  tshiozak #include <sys/file.h>
     42   1.1  tshiozak #include <sys/select.h>
     43   1.1  tshiozak #include <sys/proc.h>
     44   1.1  tshiozak #include <sys/vnode.h>
     45   1.1  tshiozak #include <sys/poll.h>
     46   1.1  tshiozak 
     47   1.1  tshiozak #include <dev/usb/usb.h>
     48   1.1  tshiozak #include <dev/usb/usbdi.h>
     49   1.1  tshiozak #include <dev/usb/usbdi_util.h>
     50   1.1  tshiozak 
     51  1.18       jdc #include <dev/auconv.h>
     52   1.1  tshiozak #include <dev/usb/usbdevs.h>
     53   1.1  tshiozak #include <dev/usb/uaudioreg.h>
     54   1.1  tshiozak #include <dev/usb/umidi_quirks.h>
     55   1.1  tshiozak 
     56   1.1  tshiozak /*
     57   1.1  tshiozak  * quirk codes for UMIDI
     58   1.1  tshiozak  */
     59   1.1  tshiozak 
     60   1.1  tshiozak #ifdef UMIDIQUIRK_DEBUG
     61   1.1  tshiozak #define DPRINTF(x)	if (umidiquirkdebug) printf x
     62   1.1  tshiozak #define DPRINTFN(n,x)	if (umidiquirkdebug >= (n)) printf x
     63   1.1  tshiozak int	umidiquirkdebug = 1;
     64   1.1  tshiozak #else
     65   1.1  tshiozak #define DPRINTF(x)
     66   1.1  tshiozak #define DPRINTFN(n,x)
     67   1.1  tshiozak #endif
     68   1.1  tshiozak 
     69   1.1  tshiozak 
     70   1.1  tshiozak /*
     71   1.1  tshiozak  * YAMAHA UX-256
     72   1.1  tshiozak  *  --- this is a typical yamaha device, but has a broken descriptor :-<
     73   1.1  tshiozak  */
     74   1.1  tshiozak 
     75  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE, 1, 1) = {
     76   1.1  tshiozak 	/* out */
     77   1.1  tshiozak 	{ 0, 16 },
     78   1.1  tshiozak 	/* in */
     79   1.1  tshiozak 	{ 1, 8 }
     80   1.1  tshiozak };
     81  1.16  gmcgarry UMQ_FIXED_EP_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE, 1, 1);
     82   1.1  tshiozak 
     83   1.1  tshiozak UMQ_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE) = {
     84   1.1  tshiozak 	UMQ_FIXED_EP_REG(YAMAHA, YAMAHA_UX256, ANYIFACE),
     85   1.1  tshiozak #if 0
     86   1.1  tshiozak 	UMQ_YAMAHA_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
     87   1.1  tshiozak #endif
     88   1.1  tshiozak 	UMQ_TERMINATOR
     89   1.1  tshiozak };
     90   1.1  tshiozak 
     91   1.1  tshiozak 
     92   1.1  tshiozak /*
     93   1.1  tshiozak  * YAMAHA generic
     94   1.1  tshiozak  */
     95   1.1  tshiozak UMQ_DEF(YAMAHA, ANYPRODUCT, ANYIFACE) = {
     96   1.1  tshiozak 	UMQ_YAMAHA_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
     97   1.1  tshiozak 	UMQ_TERMINATOR
     98   1.1  tshiozak };
     99   1.1  tshiozak 
    100   1.1  tshiozak 
    101   1.1  tshiozak /*
    102   1.1  tshiozak  * ROLAND UM-1
    103   1.1  tshiozak  */
    104  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM1, 2, 1, 1) = {
    105   1.1  tshiozak 	/* out */
    106   1.1  tshiozak 	{ 0, 1 },
    107   1.1  tshiozak 	/* in */
    108   1.1  tshiozak 	{ 1, 1 }
    109   1.1  tshiozak };
    110  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM1, 2, 1, 1);
    111   1.1  tshiozak 
    112   1.1  tshiozak UMQ_DEF(ROLAND, ROLAND_UM1, 2) = {
    113   1.1  tshiozak 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM1, 2),
    114   1.1  tshiozak 	UMQ_TERMINATOR
    115   1.1  tshiozak };
    116   1.1  tshiozak 
    117   1.4  tshiozak /*
    118   1.4  tshiozak  * ROLAND SC-8850
    119   1.4  tshiozak  */
    120  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SC8850, 2, 1, 1) = {
    121   1.4  tshiozak 	/* out */
    122   1.4  tshiozak 	{ 0, 6 },
    123   1.4  tshiozak 	/* in */
    124   1.4  tshiozak 	{ 1, 6 }
    125   1.4  tshiozak };
    126  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8850, 2, 1, 1);
    127   1.4  tshiozak 
    128   1.4  tshiozak UMQ_DEF(ROLAND, ROLAND_SC8850, 2) = {
    129   1.4  tshiozak 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8850, 2),
    130   1.4  tshiozak 	UMQ_TERMINATOR
    131   1.4  tshiozak };
    132   1.4  tshiozak 
    133   1.4  tshiozak /*
    134   1.4  tshiozak  * ROLAND SD-90
    135   1.4  tshiozak  */
    136  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SD90, 2, 1, 1) = {
    137   1.4  tshiozak 	/* out */
    138   1.4  tshiozak 	{ 0, 4 },
    139   1.4  tshiozak 	/* in */
    140   1.4  tshiozak 	{ 1, 4 }
    141   1.4  tshiozak };
    142  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD90, 2, 1, 1);
    143   1.4  tshiozak 
    144   1.4  tshiozak UMQ_DEF(ROLAND, ROLAND_SD90, 2) = {
    145   1.4  tshiozak 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD90, 2),
    146   1.4  tshiozak 	UMQ_TERMINATOR
    147   1.4  tshiozak };
    148   1.4  tshiozak 
    149   1.1  tshiozak 
    150   1.2  tshiozak /*
    151   1.2  tshiozak  * ROLAND UM-880 (native mode)
    152   1.2  tshiozak  */
    153  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM880N, 0, 1, 1) = {
    154   1.2  tshiozak 	/* out */
    155   1.2  tshiozak 	{ 0, 9 },
    156   1.2  tshiozak 	/* in */
    157   1.2  tshiozak 	{ 1, 9 }
    158   1.2  tshiozak };
    159  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM880N, 0, 1, 1);
    160   1.2  tshiozak 
    161   1.2  tshiozak UMQ_DEF(ROLAND, ROLAND_UM880N, 0) = {
    162   1.2  tshiozak 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM880N, 0),
    163   1.2  tshiozak 	UMQ_TERMINATOR
    164   1.2  tshiozak };
    165   1.2  tshiozak 
    166   1.5  jdolecek /*
    167   1.5  jdolecek  * ROLAND UA-100
    168   1.5  jdolecek  */
    169  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA100, 2, 1, 1) = {
    170   1.5  jdolecek 	/* out */
    171   1.5  jdolecek 	{ 0, 3 },
    172   1.5  jdolecek 	/* in */
    173   1.5  jdolecek 	{ 1, 3 }
    174   1.5  jdolecek };
    175  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA100, 2, 1, 1);
    176   1.5  jdolecek 
    177   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_UA100, 2) = {
    178   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA100, 2),
    179   1.5  jdolecek 	UMQ_TERMINATOR
    180   1.5  jdolecek };
    181   1.5  jdolecek 
    182   1.5  jdolecek /*
    183   1.5  jdolecek  * ROLAND UM-4
    184   1.5  jdolecek  */
    185  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM4, 2, 1, 1) = {
    186   1.5  jdolecek 	/* out */
    187   1.5  jdolecek 	{ 0, 4 },
    188   1.5  jdolecek 	/* in */
    189   1.5  jdolecek 	{ 1, 4 }
    190   1.5  jdolecek };
    191  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM4, 2, 1, 1);
    192   1.5  jdolecek 
    193   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_UM4, 2) = {
    194   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM4, 2),
    195   1.5  jdolecek 	UMQ_TERMINATOR
    196   1.5  jdolecek };
    197   1.5  jdolecek 
    198   1.5  jdolecek /*
    199   1.5  jdolecek  * ROLAND U-8
    200   1.5  jdolecek  */
    201  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_U8, 2, 1, 1) = {
    202   1.5  jdolecek 	/* out */
    203   1.5  jdolecek 	{ 0, 2 },
    204   1.5  jdolecek 	/* in */
    205   1.5  jdolecek 	{ 1, 2 }
    206   1.5  jdolecek };
    207  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_U8, 2, 1, 1);
    208   1.5  jdolecek 
    209   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_U8, 2) = {
    210   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_U8, 2),
    211   1.5  jdolecek 	UMQ_TERMINATOR
    212   1.5  jdolecek };
    213   1.5  jdolecek 
    214   1.5  jdolecek /*
    215   1.5  jdolecek  * ROLAND UM-2
    216   1.5  jdolecek  */
    217  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM2, 2, 1, 1) = {
    218   1.5  jdolecek 	/* out */
    219   1.5  jdolecek 	{ 0, 2 },
    220   1.5  jdolecek 	/* in */
    221   1.5  jdolecek 	{ 1, 2 }
    222   1.5  jdolecek };
    223  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM2, 2, 1, 1);
    224   1.5  jdolecek 
    225   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_UM2, 2) = {
    226   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM2, 2),
    227   1.5  jdolecek 	UMQ_TERMINATOR
    228   1.5  jdolecek };
    229   1.5  jdolecek 
    230   1.5  jdolecek /*
    231   1.5  jdolecek  * ROLAND SC-8820
    232   1.5  jdolecek  */
    233  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SC8820, 2, 1, 1) = {
    234   1.5  jdolecek 	/* out */
    235   1.5  jdolecek 	{ 0, 5 }, /* cables 0, 1, 4 only */
    236   1.5  jdolecek 	/* in */
    237   1.5  jdolecek 	{ 1, 5 } /* do. */
    238   1.5  jdolecek };
    239  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8820, 2, 1, 1);
    240   1.5  jdolecek 
    241   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_SC8820, 2) = {
    242   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8820, 2),
    243   1.5  jdolecek 	UMQ_TERMINATOR
    244   1.5  jdolecek };
    245   1.5  jdolecek 
    246   1.5  jdolecek /*
    247   1.5  jdolecek  * ROLAND PC-300
    248   1.5  jdolecek  */
    249  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_PC300, 2, 1, 1) = {
    250   1.5  jdolecek 	/* out */
    251   1.5  jdolecek 	{ 0, 1 },
    252   1.5  jdolecek 	/* in */
    253   1.5  jdolecek 	{ 1, 1 }
    254   1.5  jdolecek };
    255  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_PC300, 2, 1, 1);
    256   1.5  jdolecek 
    257   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_PC300, 2) = {
    258   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_PC300, 2),
    259   1.5  jdolecek 	UMQ_TERMINATOR
    260   1.5  jdolecek };
    261   1.5  jdolecek 
    262   1.5  jdolecek /*
    263   1.5  jdolecek  * ROLAND SK-500
    264   1.5  jdolecek  */
    265  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SK500, 2, 1, 1) = {
    266   1.5  jdolecek 	/* out */
    267   1.5  jdolecek 	{ 0, 5 }, /* cables 0, 1, 4 only */
    268   1.5  jdolecek 	/* in */
    269   1.5  jdolecek 	{ 1, 5 } /* do. */
    270   1.5  jdolecek };
    271  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SK500, 2, 1, 1);
    272   1.5  jdolecek 
    273   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_SK500, 2) = {
    274   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_SK500, 2),
    275   1.5  jdolecek 	UMQ_TERMINATOR
    276   1.5  jdolecek };
    277   1.5  jdolecek 
    278   1.5  jdolecek /*
    279   1.5  jdolecek  * ROLAND SC-D70
    280   1.5  jdolecek  */
    281  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SCD70, 2, 1, 1) = {
    282   1.5  jdolecek 	/* out */
    283   1.5  jdolecek 	{ 0, 3 },
    284   1.5  jdolecek 	/* in */
    285   1.5  jdolecek 	{ 1, 3 }
    286   1.5  jdolecek };
    287  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SCD70, 2, 1, 1);
    288   1.5  jdolecek 
    289   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_SCD70, 2) = {
    290   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_SCD70, 2),
    291   1.5  jdolecek 	UMQ_TERMINATOR
    292   1.5  jdolecek };
    293   1.5  jdolecek 
    294   1.5  jdolecek /*
    295   1.5  jdolecek  * ROLAND XV-5050
    296   1.5  jdolecek  */
    297  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_XV5050, 0, 1, 1) = {
    298   1.5  jdolecek 	/* out */
    299   1.5  jdolecek 	{ 0, 1 },
    300   1.5  jdolecek 	/* in */
    301   1.5  jdolecek 	{ 1, 1 }
    302   1.5  jdolecek };
    303  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_XV5050, 0, 1, 1);
    304   1.5  jdolecek 
    305   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_XV5050, 0) = {
    306   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_XV5050, 0),
    307   1.5  jdolecek 	UMQ_TERMINATOR
    308   1.5  jdolecek };
    309   1.5  jdolecek 
    310   1.5  jdolecek /*
    311   1.5  jdolecek  * ROLAND UM-550
    312   1.5  jdolecek  */
    313  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM550, 0, 1, 1) = {
    314   1.5  jdolecek 	/* out */
    315   1.5  jdolecek 	{ 0, 6 },
    316   1.5  jdolecek 	/* in */
    317   1.5  jdolecek 	{ 1, 6 }
    318   1.5  jdolecek };
    319  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM550, 0, 1, 1);
    320   1.5  jdolecek 
    321   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_UM550, 0) = {
    322   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM550, 0),
    323   1.5  jdolecek 	UMQ_TERMINATOR
    324   1.5  jdolecek };
    325   1.5  jdolecek 
    326   1.5  jdolecek /*
    327   1.5  jdolecek  * ROLAND SD-20
    328   1.5  jdolecek  */
    329  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SD20, 0, 1, 1) = {
    330   1.5  jdolecek 	/* out */
    331   1.5  jdolecek 	{ 0, 2 },
    332   1.5  jdolecek 	/* in */
    333   1.5  jdolecek 	{ 1, 3 }
    334   1.5  jdolecek };
    335  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD20, 0, 1, 1);
    336   1.5  jdolecek 
    337   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_SD20, 0) = {
    338   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD20, 0),
    339   1.5  jdolecek 	UMQ_TERMINATOR
    340   1.5  jdolecek };
    341   1.5  jdolecek 
    342   1.5  jdolecek /*
    343   1.5  jdolecek  * ROLAND SD-80
    344   1.5  jdolecek  */
    345  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SD80, 0, 1, 1) = {
    346   1.5  jdolecek 	/* out */
    347   1.5  jdolecek 	{ 0, 4 },
    348   1.5  jdolecek 	/* in */
    349   1.5  jdolecek 	{ 1, 4 }
    350   1.5  jdolecek };
    351  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD80, 0, 1, 1);
    352   1.5  jdolecek 
    353   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_SD80, 0) = {
    354   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD80, 0),
    355   1.5  jdolecek 	UMQ_TERMINATOR
    356   1.5  jdolecek };
    357   1.5  jdolecek 
    358   1.5  jdolecek /*
    359   1.5  jdolecek  * ROLAND UA-700
    360   1.5  jdolecek  */
    361  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA700, 3, 1, 1) = {
    362   1.5  jdolecek 	/* out */
    363   1.5  jdolecek 	{ 0, 2 },
    364   1.5  jdolecek 	/* in */
    365   1.5  jdolecek 	{ 1, 2 }
    366   1.5  jdolecek };
    367  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA700, 3, 1, 1);
    368   1.5  jdolecek 
    369   1.5  jdolecek UMQ_DEF(ROLAND, ROLAND_UA700, 3) = {
    370   1.5  jdolecek 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA700, 3),
    371   1.5  jdolecek 	UMQ_TERMINATOR
    372   1.5  jdolecek };
    373   1.5  jdolecek 
    374   1.8  augustss /*
    375   1.8  augustss  * ROLAND UA-1000
    376   1.8  augustss  */
    377  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA1000, 3, 1, 1) = {
    378   1.8  augustss 	/* out */
    379   1.8  augustss 	{ 0, 2 },
    380   1.8  augustss 	/* in */
    381   1.8  augustss 	{ 1, 2 }
    382   1.8  augustss };
    383  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA1000, 3, 1, 1);
    384   1.8  augustss 
    385   1.8  augustss UMQ_DEF(ROLAND, ROLAND_UA1000, 3) = {
    386   1.8  augustss 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA1000, 3),
    387   1.8  augustss 	UMQ_TERMINATOR
    388   1.8  augustss };
    389   1.8  augustss 
    390   1.8  augustss /*
    391   1.8  augustss  * ROLAND UA-101
    392   1.8  augustss  */
    393  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA101, 2, 1, 1) = {
    394   1.8  augustss 	/* out */
    395   1.8  augustss 	{ 0, 2 },
    396   1.8  augustss 	/* in */
    397   1.8  augustss 	{ 1, 2 }
    398   1.8  augustss };
    399  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA101, 2, 1, 1);
    400   1.2  tshiozak 
    401   1.8  augustss UMQ_DEF(ROLAND, ROLAND_UA101, 2) = {
    402   1.8  augustss 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA101, 2),
    403   1.8  augustss 	UMQ_TERMINATOR
    404   1.8  augustss };
    405   1.8  augustss 
    406  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA101F, 2, 1, 1) = {
    407   1.8  augustss 	/* out */
    408   1.8  augustss 	{ 0, 2 },
    409   1.8  augustss 	/* in */
    410   1.8  augustss 	{ 1, 2 }
    411   1.8  augustss };
    412  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA101F, 2, 1, 1);
    413   1.8  augustss 
    414   1.8  augustss UMQ_DEF(ROLAND, ROLAND_UA101F, 2) = {
    415   1.8  augustss 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA101F, 2),
    416   1.8  augustss 	UMQ_TERMINATOR
    417   1.8  augustss };
    418   1.8  augustss 
    419   1.8  augustss /*
    420   1.8  augustss  * ROLAND Fantom-X
    421   1.8  augustss  */
    422  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_FANTOMX, 0, 1, 1) = {
    423   1.8  augustss 	/* out */
    424   1.8  augustss 	{ 0, 1 },
    425   1.8  augustss 	/* in */
    426   1.8  augustss 	{ 1, 1 }
    427   1.8  augustss };
    428  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_FANTOMX, 0, 1, 1);
    429   1.8  augustss 
    430   1.8  augustss UMQ_DEF(ROLAND, ROLAND_FANTOMX, 0) = {
    431   1.8  augustss 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_FANTOMX, 0),
    432   1.8  augustss 	UMQ_TERMINATOR
    433   1.8  augustss };
    434   1.8  augustss 
    435   1.8  augustss /*
    436   1.8  augustss  * ROLAND PCR
    437   1.8  augustss  */
    438  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_PCR, 0, 1, 1) = {
    439   1.8  augustss 	/* out */
    440   1.8  augustss 	{ 0, 3 },
    441   1.8  augustss 	/* in */
    442   1.8  augustss 	{ 1, 3 }
    443   1.8  augustss };
    444  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_PCR, 0, 1, 1);
    445   1.8  augustss 
    446   1.8  augustss UMQ_DEF(ROLAND, ROLAND_PCR, 0) = {
    447   1.8  augustss 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_PCR, 0),
    448   1.8  augustss 	UMQ_TERMINATOR
    449   1.8  augustss };
    450   1.1  tshiozak 
    451   1.1  tshiozak /*
    452  1.10  christos  * ROLAND UM-3EX
    453  1.10  christos  */
    454  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM3, 0, 1, 1) = {
    455  1.10  christos 	/* out */
    456  1.10  christos 	{ 0, 3 },
    457  1.10  christos 	/* in */
    458  1.10  christos 	{ 1, 3 }
    459  1.10  christos };
    460  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM3, 0, 1, 1);
    461  1.10  christos 
    462  1.10  christos UMQ_DEF(ROLAND, ROLAND_UM3, 0) = {
    463  1.10  christos 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM3, 0),
    464  1.10  christos 	UMQ_TERMINATOR
    465  1.10  christos };
    466  1.10  christos 
    467  1.10  christos /*
    468  1.13   xtraeme  * ROLAND UA-25
    469  1.13   xtraeme  */
    470  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA25, 2, 1, 1) = {
    471  1.13   xtraeme 	/* out */
    472  1.13   xtraeme 	{ 0, 1 },
    473  1.13   xtraeme 	/* in */
    474  1.13   xtraeme 	{ 1, 1 }
    475  1.13   xtraeme };
    476  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA25, 2, 1, 1);
    477  1.13   xtraeme 
    478  1.13   xtraeme UMQ_DEF(ROLAND, ROLAND_UA25, 2) = {
    479  1.13   xtraeme 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA25, 2),
    480  1.13   xtraeme 	UMQ_TERMINATOR
    481  1.13   xtraeme };
    482  1.13   xtraeme 
    483  1.13   xtraeme /*
    484  1.13   xtraeme  * ROLAND UA-4FX
    485  1.13   xtraeme  */
    486  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA4FX, 2, 1, 1) = {
    487  1.13   xtraeme 	/* out */
    488  1.13   xtraeme 	{ 0, 1 },
    489  1.13   xtraeme 	/* in */
    490  1.13   xtraeme 	{ 1, 1 }
    491  1.13   xtraeme };
    492  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA4FX, 2, 1, 1);
    493  1.13   xtraeme 
    494  1.13   xtraeme UMQ_DEF(ROLAND, ROLAND_UA4FX, 2) = {
    495  1.13   xtraeme 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA4FX, 2),
    496  1.13   xtraeme 	UMQ_TERMINATOR
    497  1.13   xtraeme };
    498  1.13   xtraeme 
    499  1.13   xtraeme /*
    500  1.13   xtraeme  * ROLAND SonicCell
    501  1.13   xtraeme  */
    502  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SONICCELL, 2, 1, 1) = {
    503  1.13   xtraeme 	/* out */
    504  1.13   xtraeme 	{ 0, 1 },
    505  1.13   xtraeme 	/* in */
    506  1.13   xtraeme 	{ 1, 1 }
    507  1.13   xtraeme };
    508  1.16  gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SONICCELL, 2, 1, 1);
    509  1.13   xtraeme 
    510  1.13   xtraeme UMQ_DEF(ROLAND, ROLAND_SONICCELL, 2) = {
    511  1.13   xtraeme 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_SONICCELL, 2),
    512  1.13   xtraeme 	UMQ_TERMINATOR
    513  1.13   xtraeme };
    514  1.13   xtraeme 
    515  1.13   xtraeme /*
    516  1.17    plunky  * ROLAND UM-ONE
    517  1.17    plunky  */
    518  1.17    plunky UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UMONE, ANYIFACE, 1, 1) = {
    519  1.17    plunky 	/* out */
    520  1.17    plunky 	{ 0, 1 },
    521  1.17    plunky 	/* in */
    522  1.17    plunky 	{ 1, 1 }
    523  1.17    plunky };
    524  1.17    plunky UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UMONE, ANYIFACE, 1, 1);
    525  1.17    plunky 
    526  1.17    plunky UMQ_DEF(ROLAND, ROLAND_UMONE, ANYIFACE) = {
    527  1.17    plunky 	UMQ_FIXED_EP_REG(ROLAND, ROLAND_UMONE, ANYIFACE),
    528  1.17    plunky 	UMQ_TERMINATOR
    529  1.17    plunky };
    530  1.17    plunky 
    531  1.17    plunky /*
    532  1.11      chap  * Midiman Midisport 2x4. This has 2 physical MIDI IN jacks that are read
    533  1.11      chap  * on endpoint 0x81 (descriptor index 0). It has 4 physical MIDI OUT jacks
    534  1.11      chap  * that can be written on endpoints 2 or 4 (at descriptor index 2 or 4,
    535  1.11      chap  * coincidentally) interchangeably: either endpoint will accept a Cable Number
    536  1.11      chap  * field of 0 to 3, and data for a given CN will be routed to the same
    537  1.11      chap  * physical output regardless of the endpoint used for the transfer. But
    538  1.11      chap  * there's a catch: flow-control feedback only goes to endpoint 2 for
    539  1.11      chap  * CN 0 and 2, and only to endpoint 4 for CN 1 and 3. If you send output at
    540  1.11      chap  * high rates for CN 0 or 2 over endpoint 4, or for CN 1 or 3 over endpoint 2,
    541  1.11      chap  * the USB transfers complete as fast as possible, giving you an apparent data
    542  1.11      chap  * rate much higher than MIDI's 3125 cps (easy to measure using dd to blast a
    543  1.11      chap  * bunch of midi data to the rmidi device). Of course that isn't a way to make
    544  1.11      chap  * MIDI faster, just a way to overrun the device buffer and spray bits on the
    545  1.11      chap  * floor. So this device needs the fixed endpoint quirk, the fixed cable number
    546  1.11      chap  * quirk (to make sure CNs 0 and 2 are put on the first endpoint and 1 and 3
    547  1.11      chap  * on the other), and then the fixed mididev-assignment quirk (to match jacks
    548  1.11      chap  * to mididevs so the rmidi devices match the order of the blinkenlights).
    549  1.11      chap  */
    550  1.16  gmcgarry UMQ_FIXED_EP_DATA_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE, 2, 1) = {
    551  1.11      chap 	/* out: ep# jacks */
    552  1.11      chap 	{ 2, 2 },
    553  1.11      chap 	{ 4, 2 },
    554  1.11      chap 	/* in: ep# jacks */
    555  1.11      chap 	{ 0, 2 }
    556  1.11      chap };
    557  1.16  gmcgarry UMQ_FIXED_EP_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE, 2, 1);
    558  1.16  gmcgarry UMQ_FIXED_CN_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE) = {
    559  1.16  gmcgarry 	0, 2, 1, 3, 0, 1
    560  1.16  gmcgarry };
    561  1.16  gmcgarry UMQ_FIXED_MD_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE) = {
    562  1.16  gmcgarry 	 0, 0, 2, 1, 1, -1, 3, -1
    563  1.16  gmcgarry };
    564  1.11      chap UMQ_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE) = {
    565  1.11      chap 	UMQ_FIXED_EP_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE),
    566  1.16  gmcgarry 	UMQ_FIXED_CN_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE),
    567  1.16  gmcgarry 	UMQ_FIXED_MD_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE),
    568  1.11      chap 	UMQ_TYPE(MIDIMAN_GARBLE),
    569  1.11      chap 	UMQ_TERMINATOR
    570  1.11      chap };
    571  1.11      chap 
    572  1.11      chap /*
    573   1.1  tshiozak  * quirk list
    574   1.1  tshiozak  */
    575  1.16  gmcgarry static struct umidi_quirk umidi_quirklist[] = {
    576   1.1  tshiozak 	UMQ_REG(YAMAHA, YAMAHA_UX256, ANYIFACE),
    577   1.1  tshiozak 	UMQ_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
    578   1.1  tshiozak 	UMQ_REG(ROLAND, ROLAND_UM1, 2),
    579   1.4  tshiozak 	UMQ_REG(ROLAND, ROLAND_SC8850, 2),
    580   1.4  tshiozak 	UMQ_REG(ROLAND, ROLAND_SD90, 2),
    581   1.2  tshiozak 	UMQ_REG(ROLAND, ROLAND_UM880N, 0),
    582   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_UA100, 2),
    583   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_UM4, 2),
    584   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_U8, 2),
    585   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_UM2, 2),
    586   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_SC8820, 2),
    587   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_PC300, 2),
    588   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_SK500, 2),
    589   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_SCD70, 2),
    590   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_XV5050, 0),
    591   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_UM550, 0),
    592   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_SD20, 0),
    593   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_SD80, 0),
    594   1.5  jdolecek 	UMQ_REG(ROLAND, ROLAND_UA700, 3),
    595   1.8  augustss 	UMQ_REG(ROLAND, ROLAND_UA1000, 3),
    596   1.8  augustss 	UMQ_REG(ROLAND, ROLAND_UA101, 2),
    597   1.8  augustss 	UMQ_REG(ROLAND, ROLAND_UA101F, 2),
    598   1.8  augustss 	UMQ_REG(ROLAND, ROLAND_FANTOMX, 0),
    599   1.8  augustss 	UMQ_REG(ROLAND, ROLAND_PCR, 0),
    600  1.10  christos 	UMQ_REG(ROLAND, ROLAND_UM3, 0),
    601  1.13   xtraeme 	UMQ_REG(ROLAND, ROLAND_UA25, 2),
    602  1.13   xtraeme 	UMQ_REG(ROLAND, ROLAND_UA4FX, 2),
    603  1.13   xtraeme 	UMQ_REG(ROLAND, ROLAND_SONICCELL, 2),
    604  1.17    plunky 	UMQ_REG(ROLAND, ROLAND_UMONE, ANYIFACE),
    605  1.11      chap 	UMQ_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE),
    606  1.12  christos 	{ .vendor = 0 },
    607   1.1  tshiozak };
    608   1.1  tshiozak 
    609   1.1  tshiozak 
    610   1.1  tshiozak /*
    611   1.1  tshiozak  * quirk utilities
    612   1.1  tshiozak  */
    613   1.1  tshiozak 
    614  1.16  gmcgarry const struct umidi_quirk *
    615   1.1  tshiozak umidi_search_quirk(int vendor, int product, int ifaceno)
    616   1.1  tshiozak {
    617   1.1  tshiozak 	struct umidi_quirk *p;
    618  1.16  gmcgarry 	const struct umq_data *q;
    619   1.1  tshiozak 
    620   1.1  tshiozak 	DPRINTF(("umidi_search_quirk: v=%d, p=%d, i=%d\n",
    621   1.1  tshiozak 		 vendor, product, ifaceno));
    622   1.1  tshiozak 
    623   1.1  tshiozak 	for (p=&umidi_quirklist[0]; p->vendor; p++) {
    624   1.1  tshiozak 		DPRINTFN(10, ("\tv=%d, p=%d, i=%d",
    625   1.1  tshiozak 			      p->vendor, p->product, p->iface));
    626   1.1  tshiozak 		if ((p->vendor==vendor || p->vendor==ANYVENDOR) &&
    627   1.1  tshiozak 		    (p->product==product || p->product==ANYPRODUCT) &&
    628   1.1  tshiozak 		    (p->iface==ifaceno || p->iface==ANYIFACE)) {
    629   1.1  tshiozak 			DPRINTFN(10, (" found\n"));
    630   1.1  tshiozak 			if (!p->type_mask)
    631   1.1  tshiozak 				/* make quirk mask */
    632   1.1  tshiozak 				for (q=p->quirks; q->type; q++)
    633   1.1  tshiozak 					p->type_mask |= 1<<(q->type-1);
    634   1.1  tshiozak 			return p;
    635   1.8  augustss 		}
    636   1.1  tshiozak 		DPRINTFN(10, ("\n"));
    637   1.1  tshiozak 	}
    638   1.1  tshiozak 
    639   1.1  tshiozak 	return NULL;
    640   1.1  tshiozak }
    641   1.1  tshiozak 
    642   1.7  christos static const char *quirk_name[] = {
    643   1.1  tshiozak 	"NULL",
    644   1.1  tshiozak 	"Fixed Endpoint",
    645   1.1  tshiozak 	"Yamaha Specific",
    646  1.11      chap 	"Midiman Packet Garbling",
    647  1.11      chap 	"Cable Numbers per Endpoint",
    648  1.11      chap 	"Cable Numbers Global",
    649  1.11      chap 	"Cable Numbers Fixed",
    650  1.11      chap 	"Unit Mapping Fixed",
    651   1.1  tshiozak };
    652   1.1  tshiozak 
    653   1.1  tshiozak void
    654  1.16  gmcgarry umidi_print_quirk(const struct umidi_quirk *q)
    655   1.1  tshiozak {
    656  1.16  gmcgarry 	const struct umq_data *qd;
    657   1.1  tshiozak 	if (q) {
    658   1.1  tshiozak 		printf("(");
    659   1.1  tshiozak 		for (qd=q->quirks; qd->type; qd++)
    660   1.1  tshiozak 			printf("%s%s", quirk_name[qd->type],
    661   1.1  tshiozak 			       (qd+1)->type?", ":")\n");
    662   1.1  tshiozak 	} else {
    663   1.1  tshiozak 		printf("(genuine USB-MIDI)\n");
    664   1.1  tshiozak 	}
    665   1.1  tshiozak }
    666   1.1  tshiozak 
    667  1.16  gmcgarry const void *
    668  1.20     skrll umidi_get_quirk_data_from_type(const struct umidi_quirk *q, uint32_t type)
    669   1.1  tshiozak {
    670  1.16  gmcgarry 	const struct umq_data *qd;
    671   1.1  tshiozak 	if (q) {
    672   1.1  tshiozak 		for (qd=q->quirks; qd->type; qd++)
    673   1.1  tshiozak 			if (qd->type == type)
    674   1.1  tshiozak 				return qd->data;
    675   1.1  tshiozak 	}
    676   1.1  tshiozak 	return NULL;
    677   1.1  tshiozak }
    678