Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * bebob.c - a part of driver for BeBoB based devices
0004  *
0005  * Copyright (c) 2013-2014 Takashi Sakamoto
0006  */
0007 
0008 /*
0009  * BeBoB is 'BridgeCo enhanced Breakout Box'. This is installed to firewire
0010  * devices with DM1000/DM1100/DM1500 chipset. It gives common way for host
0011  * system to handle BeBoB based devices.
0012  */
0013 
0014 #include "bebob.h"
0015 
0016 MODULE_DESCRIPTION("BridgeCo BeBoB driver");
0017 MODULE_AUTHOR("Takashi Sakamoto <o-takashi@sakamocchi.jp>");
0018 MODULE_LICENSE("GPL v2");
0019 
0020 static int index[SNDRV_CARDS]   = SNDRV_DEFAULT_IDX;
0021 static char *id[SNDRV_CARDS]    = SNDRV_DEFAULT_STR;
0022 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
0023 
0024 module_param_array(index, int, NULL, 0444);
0025 MODULE_PARM_DESC(index, "card index");
0026 module_param_array(id, charp, NULL, 0444);
0027 MODULE_PARM_DESC(id, "ID string");
0028 module_param_array(enable, bool, NULL, 0444);
0029 MODULE_PARM_DESC(enable, "enable BeBoB sound card");
0030 
0031 static DEFINE_MUTEX(devices_mutex);
0032 static DECLARE_BITMAP(devices_used, SNDRV_CARDS);
0033 
0034 /* Offsets from information register. */
0035 #define INFO_OFFSET_BEBOB_VERSION   0x08
0036 #define INFO_OFFSET_GUID        0x10
0037 #define INFO_OFFSET_HW_MODEL_ID     0x18
0038 #define INFO_OFFSET_HW_MODEL_REVISION   0x1c
0039 
0040 #define VEN_EDIROL  0x000040ab
0041 #define VEN_PRESONUS    0x00000a92
0042 #define VEN_BRIDGECO    0x000007f5
0043 #define VEN_MACKIE  0x00000ff2
0044 #define VEN_STANTON 0x00001260
0045 #define VEN_TASCAM  0x0000022e
0046 #define VEN_BEHRINGER   0x00001564
0047 #define VEN_APOGEE  0x000003db
0048 #define VEN_ESI     0x00000f1b
0049 #define VEN_CME     0x0000000a
0050 #define VEN_PHONIC  0x00001496
0051 #define VEN_LYNX    0x000019e5
0052 #define VEN_ICON    0x00001a9e
0053 #define VEN_PRISMSOUND  0x00001198
0054 #define VEN_TERRATEC    0x00000aac
0055 #define VEN_YAMAHA  0x0000a0de
0056 #define VEN_FOCUSRITE   0x0000130e
0057 #define VEN_MAUDIO  0x00000d6c
0058 #define VEN_DIGIDESIGN  0x00a07e
0059 #define OUI_SHOUYO  0x002327
0060 
0061 #define MODEL_FOCUSRITE_SAFFIRE_BOTH    0x00000000
0062 #define MODEL_MAUDIO_AUDIOPHILE_BOTH    0x00010060
0063 #define MODEL_MAUDIO_FW1814     0x00010071
0064 #define MODEL_MAUDIO_PROJECTMIX     0x00010091
0065 #define MODEL_MAUDIO_PROFIRELIGHTBRIDGE 0x000100a1
0066 
0067 static int
0068 name_device(struct snd_bebob *bebob)
0069 {
0070     struct fw_device *fw_dev = fw_parent_device(bebob->unit);
0071     char vendor[24] = {0};
0072     char model[32] = {0};
0073     u32 hw_id;
0074     u32 data[2] = {0};
0075     u32 revision;
0076     int err;
0077 
0078     /* get vendor name from root directory */
0079     err = fw_csr_string(fw_dev->config_rom + 5, CSR_VENDOR,
0080                 vendor, sizeof(vendor));
0081     if (err < 0)
0082         goto end;
0083 
0084     /* get model name from unit directory */
0085     err = fw_csr_string(bebob->unit->directory, CSR_MODEL,
0086                 model, sizeof(model));
0087     if (err < 0)
0088         goto end;
0089 
0090     /* get hardware id */
0091     err = snd_bebob_read_quad(bebob->unit, INFO_OFFSET_HW_MODEL_ID,
0092                   &hw_id);
0093     if (err < 0)
0094         goto end;
0095 
0096     /* get hardware revision */
0097     err = snd_bebob_read_quad(bebob->unit, INFO_OFFSET_HW_MODEL_REVISION,
0098                   &revision);
0099     if (err < 0)
0100         goto end;
0101 
0102     /* get GUID */
0103     err = snd_bebob_read_block(bebob->unit, INFO_OFFSET_GUID,
0104                    data, sizeof(data));
0105     if (err < 0)
0106         goto end;
0107 
0108     strcpy(bebob->card->driver, "BeBoB");
0109     strcpy(bebob->card->shortname, model);
0110     strcpy(bebob->card->mixername, model);
0111     snprintf(bebob->card->longname, sizeof(bebob->card->longname),
0112          "%s %s (id:%d, rev:%d), GUID %08x%08x at %s, S%d",
0113          vendor, model, hw_id, revision,
0114          data[0], data[1], dev_name(&bebob->unit->device),
0115          100 << fw_dev->max_speed);
0116 end:
0117     return err;
0118 }
0119 
0120 static void
0121 bebob_card_free(struct snd_card *card)
0122 {
0123     struct snd_bebob *bebob = card->private_data;
0124 
0125     mutex_lock(&devices_mutex);
0126     clear_bit(bebob->card_index, devices_used);
0127     mutex_unlock(&devices_mutex);
0128 
0129     snd_bebob_stream_destroy_duplex(bebob);
0130 
0131     mutex_destroy(&bebob->mutex);
0132     fw_unit_put(bebob->unit);
0133 }
0134 
0135 static const struct snd_bebob_spec *
0136 get_saffire_spec(struct fw_unit *unit)
0137 {
0138     char name[24] = {0};
0139 
0140     if (fw_csr_string(unit->directory, CSR_MODEL, name, sizeof(name)) < 0)
0141         return NULL;
0142 
0143     if (strcmp(name, "SaffireLE") == 0)
0144         return &saffire_le_spec;
0145     else
0146         return &saffire_spec;
0147 }
0148 
0149 static bool
0150 check_audiophile_booted(struct fw_unit *unit)
0151 {
0152     char name[28] = {0};
0153 
0154     if (fw_csr_string(unit->directory, CSR_MODEL, name, sizeof(name)) < 0)
0155         return false;
0156 
0157     return strncmp(name, "FW Audiophile Bootloader", 24) != 0;
0158 }
0159 
0160 static int detect_quirks(struct snd_bebob *bebob, const struct ieee1394_device_id *entry)
0161 {
0162     if (entry->vendor_id == VEN_MAUDIO) {
0163         switch (entry->model_id) {
0164         case MODEL_MAUDIO_PROFIRELIGHTBRIDGE:
0165             // M-Audio ProFire Lightbridge has a quirk to transfer packets with
0166             // discontinuous cycle or data block counter in early stage of packet
0167             // streaming. The cycle span from the first packet with event is variable.
0168             bebob->quirks |= SND_BEBOB_QUIRK_INITIAL_DISCONTINUOUS_DBC;
0169             break;
0170         case MODEL_MAUDIO_FW1814:
0171         case MODEL_MAUDIO_PROJECTMIX:
0172             // At high sampling rate, M-Audio special firmware transmits empty packet
0173             // with the value of dbc incremented by 8.
0174             bebob->quirks |= SND_BEBOB_QUIRK_WRONG_DBC;
0175             break;
0176         default:
0177             break;
0178         }
0179     }
0180 
0181     return 0;
0182 }
0183 
0184 static int bebob_probe(struct fw_unit *unit, const struct ieee1394_device_id *entry)
0185 {
0186     unsigned int card_index;
0187     struct snd_card *card;
0188     struct snd_bebob *bebob;
0189     const struct snd_bebob_spec *spec;
0190     int err;
0191 
0192     if (entry->vendor_id == VEN_FOCUSRITE &&
0193         entry->model_id == MODEL_FOCUSRITE_SAFFIRE_BOTH)
0194         spec = get_saffire_spec(unit);
0195     else if (entry->vendor_id == VEN_MAUDIO &&
0196          entry->model_id == MODEL_MAUDIO_AUDIOPHILE_BOTH &&
0197          !check_audiophile_booted(unit))
0198         spec = NULL;
0199     else
0200         spec = (const struct snd_bebob_spec *)entry->driver_data;
0201 
0202     if (spec == NULL) {
0203         // To boot up M-Audio models.
0204         if (entry->vendor_id == VEN_MAUDIO || entry->vendor_id == VEN_BRIDGECO)
0205             return snd_bebob_maudio_load_firmware(unit);
0206         else
0207             return -ENODEV;
0208     }
0209 
0210     mutex_lock(&devices_mutex);
0211     for (card_index = 0; card_index < SNDRV_CARDS; card_index++) {
0212         if (!test_bit(card_index, devices_used) && enable[card_index])
0213             break;
0214     }
0215     if (card_index >= SNDRV_CARDS) {
0216         mutex_unlock(&devices_mutex);
0217         return -ENOENT;
0218     }
0219 
0220     err = snd_card_new(&unit->device, index[card_index], id[card_index], THIS_MODULE,
0221                sizeof(*bebob), &card);
0222     if (err < 0) {
0223         mutex_unlock(&devices_mutex);
0224         return err;
0225     }
0226     card->private_free = bebob_card_free;
0227     set_bit(card_index, devices_used);
0228     mutex_unlock(&devices_mutex);
0229 
0230     bebob = card->private_data;
0231     bebob->unit = fw_unit_get(unit);
0232     dev_set_drvdata(&unit->device, bebob);
0233     bebob->card = card;
0234     bebob->card_index = card_index;
0235 
0236     bebob->spec = spec;
0237     mutex_init(&bebob->mutex);
0238     spin_lock_init(&bebob->lock);
0239     init_waitqueue_head(&bebob->hwdep_wait);
0240 
0241     err = name_device(bebob);
0242     if (err < 0)
0243         goto error;
0244 
0245     err = detect_quirks(bebob, entry);
0246     if (err < 0)
0247         goto error;
0248 
0249     if (bebob->spec == &maudio_special_spec) {
0250         if (entry->model_id == MODEL_MAUDIO_FW1814)
0251             err = snd_bebob_maudio_special_discover(bebob, true);
0252         else
0253             err = snd_bebob_maudio_special_discover(bebob, false);
0254     } else {
0255         err = snd_bebob_stream_discover(bebob);
0256     }
0257     if (err < 0)
0258         goto error;
0259 
0260     err = snd_bebob_stream_init_duplex(bebob);
0261     if (err < 0)
0262         goto error;
0263 
0264     snd_bebob_proc_init(bebob);
0265 
0266     if (bebob->midi_input_ports > 0 || bebob->midi_output_ports > 0) {
0267         err = snd_bebob_create_midi_devices(bebob);
0268         if (err < 0)
0269             goto error;
0270     }
0271 
0272     err = snd_bebob_create_pcm_devices(bebob);
0273     if (err < 0)
0274         goto error;
0275 
0276     err = snd_bebob_create_hwdep_device(bebob);
0277     if (err < 0)
0278         goto error;
0279 
0280     err = snd_card_register(card);
0281     if (err < 0)
0282         goto error;
0283 
0284     if (entry->vendor_id == VEN_MAUDIO &&
0285         (entry->model_id == MODEL_MAUDIO_FW1814 || entry->model_id == MODEL_MAUDIO_PROJECTMIX)) {
0286         // This is a workaround. This bus reset seems to have an effect to make devices
0287         // correctly handling transactions. Without this, the devices have gap_count
0288         // mismatch. This causes much failure of transaction.
0289         //
0290         // Just after registration, user-land application receive signals from dbus and
0291         // starts I/Os. To avoid I/Os till the future bus reset, registration is done in
0292         // next update().
0293         fw_schedule_bus_reset(fw_parent_device(bebob->unit)->card, false, true);
0294     }
0295 
0296     return 0;
0297 error:
0298     snd_card_free(card);
0299     return err;
0300 }
0301 
0302 /*
0303  * This driver doesn't update streams in bus reset handler.
0304  *
0305  * DM1000/ DM1100/DM1500 chipsets with BeBoB firmware transfer packets with
0306  * discontinued counter at bus reset. This discontinuity is immediately
0307  * detected in packet streaming layer, then it sets XRUN to PCM substream.
0308  *
0309  * ALSA PCM applications can know the XRUN by getting -EPIPE from PCM operation.
0310  * Then, they can recover the PCM substream by executing ioctl(2) with
0311  * SNDRV_PCM_IOCTL_PREPARE. 'struct snd_pcm_ops.prepare' is called and drivers
0312  * restart packet streaming.
0313  *
0314  * The above processing may be executed before this bus-reset handler is
0315  * executed. When this handler updates streams with current isochronous
0316  * channels, the streams already have the current ones.
0317  */
0318 static void
0319 bebob_update(struct fw_unit *unit)
0320 {
0321     struct snd_bebob *bebob = dev_get_drvdata(&unit->device);
0322 
0323     if (bebob == NULL)
0324         return;
0325 
0326     fcp_bus_reset(bebob->unit);
0327 }
0328 
0329 static void bebob_remove(struct fw_unit *unit)
0330 {
0331     struct snd_bebob *bebob = dev_get_drvdata(&unit->device);
0332 
0333     if (bebob == NULL)
0334         return;
0335 
0336     // Block till all of ALSA character devices are released.
0337     snd_card_free(bebob->card);
0338 }
0339 
0340 static const struct snd_bebob_rate_spec normal_rate_spec = {
0341     .get    = &snd_bebob_stream_get_rate,
0342     .set    = &snd_bebob_stream_set_rate
0343 };
0344 static const struct snd_bebob_spec spec_normal = {
0345     .clock  = NULL,
0346     .rate   = &normal_rate_spec,
0347     .meter  = NULL
0348 };
0349 
0350 #define SPECIFIER_1394TA    0x00a02d
0351 
0352 // The immediate entry for version in unit directory differs depending on models:
0353 //  * 0x010001
0354 //  * 0x014001
0355 #define SND_BEBOB_DEV_ENTRY(vendor, model, data) \
0356 { \
0357     .match_flags    = IEEE1394_MATCH_VENDOR_ID | \
0358               IEEE1394_MATCH_MODEL_ID | \
0359               IEEE1394_MATCH_SPECIFIER_ID, \
0360     .vendor_id  = vendor, \
0361     .model_id   = model, \
0362     .specifier_id   = SPECIFIER_1394TA, \
0363     .driver_data    = (kernel_ulong_t)data \
0364 }
0365 
0366 static const struct ieee1394_device_id bebob_id_table[] = {
0367     /* Edirol, FA-66 */
0368     SND_BEBOB_DEV_ENTRY(VEN_EDIROL, 0x00010049, &spec_normal),
0369     /* Edirol, FA-101 */
0370     SND_BEBOB_DEV_ENTRY(VEN_EDIROL, 0x00010048, &spec_normal),
0371     /* Presonus, FIREBOX */
0372     SND_BEBOB_DEV_ENTRY(VEN_PRESONUS, 0x00010000, &spec_normal),
0373     /* PreSonus, FIREPOD/FP10 */
0374     SND_BEBOB_DEV_ENTRY(VEN_PRESONUS, 0x00010066, &spec_normal),
0375     /* PreSonus, Inspire1394 */
0376     SND_BEBOB_DEV_ENTRY(VEN_PRESONUS, 0x00010001, &spec_normal),
0377     /* BridgeCo, RDAudio1 */
0378     SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010048, &spec_normal),
0379     /* BridgeCo, Audio5 */
0380     SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010049, &spec_normal),
0381     /* Mackie, Onyx 1220/1620/1640 (Firewire I/O Card) */
0382     SND_BEBOB_DEV_ENTRY(VEN_MACKIE, 0x00010065, &spec_normal),
0383     // Mackie, d.2 (optional Firewire card with DM1000).
0384     SND_BEBOB_DEV_ENTRY(VEN_MACKIE, 0x00010067, &spec_normal),
0385     /* Stanton, ScratchAmp */
0386     SND_BEBOB_DEV_ENTRY(VEN_STANTON, 0x00000001, &spec_normal),
0387     /* Tascam, IF-FW DM */
0388     SND_BEBOB_DEV_ENTRY(VEN_TASCAM, 0x00010067, &spec_normal),
0389     /* Behringer, XENIX UFX 1204 */
0390     SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x00001204, &spec_normal),
0391     /* Behringer, XENIX UFX 1604 */
0392     SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x00001604, &spec_normal),
0393     /* Behringer, Digital Mixer X32 series (X-UF Card) */
0394     SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x00000006, &spec_normal),
0395     /*  Behringer, F-Control Audio 1616 */
0396     SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x001616, &spec_normal),
0397     /*  Behringer, F-Control Audio 610 */
0398     SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x000610, &spec_normal),
0399     /* Apogee Electronics, Rosetta 200/400 (X-FireWire card) */
0400     /* Apogee Electronics, DA/AD/DD-16X (X-FireWire card) */
0401     SND_BEBOB_DEV_ENTRY(VEN_APOGEE, 0x00010048, &spec_normal),
0402     /* Apogee Electronics, Ensemble */
0403     SND_BEBOB_DEV_ENTRY(VEN_APOGEE, 0x01eeee, &spec_normal),
0404     /* ESI, Quatafire610 */
0405     SND_BEBOB_DEV_ENTRY(VEN_ESI, 0x00010064, &spec_normal),
0406     /* CME, MatrixKFW */
0407     SND_BEBOB_DEV_ENTRY(VEN_CME, 0x00030000, &spec_normal),
0408     // Phonic Helix Board 12 FireWire MkII.
0409     SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00050000, &spec_normal),
0410     // Phonic Helix Board 18 FireWire MkII.
0411     SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00060000, &spec_normal),
0412     // Phonic Helix Board 24 FireWire MkII.
0413     SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00070000, &spec_normal),
0414     // Phonic FireFly 808 FireWire.
0415     SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00080000, &spec_normal),
0416     // Phonic FireFly 202, 302, 808 Universal.
0417     // Phinic Helix Board 12/18/24 FireWire, 12/18/24 Universal
0418     SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00000000, &spec_normal),
0419     /* Lynx, Aurora 8/16 (LT-FW) */
0420     SND_BEBOB_DEV_ENTRY(VEN_LYNX, 0x00000001, &spec_normal),
0421     /* ICON, FireXon */
0422     SND_BEBOB_DEV_ENTRY(VEN_ICON, 0x00000001, &spec_normal),
0423     /* PrismSound, Orpheus */
0424     SND_BEBOB_DEV_ENTRY(VEN_PRISMSOUND, 0x00010048, &spec_normal),
0425     /* PrismSound, ADA-8XR */
0426     SND_BEBOB_DEV_ENTRY(VEN_PRISMSOUND, 0x0000ada8, &spec_normal),
0427     /* TerraTec Electronic GmbH, PHASE 88 Rack FW */
0428     SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000003, &phase88_rack_spec),
0429     /* TerraTec Electronic GmbH, PHASE 24 FW */
0430     SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000004, &yamaha_terratec_spec),
0431     /* TerraTec Electronic GmbH, Phase X24 FW */
0432     SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000007, &yamaha_terratec_spec),
0433     /* TerraTec Electronic GmbH, EWS MIC2/MIC8 */
0434     SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000005, &spec_normal),
0435     // Terratec Electronic GmbH, Aureon 7.1 Firewire.
0436     // AcousticReality, eAR Master One, Eroica, Figaro, and Ciaccona. Perhaps Terratec OEM.
0437     SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000002, &spec_normal),
0438     /* Yamaha, GO44 */
0439     SND_BEBOB_DEV_ENTRY(VEN_YAMAHA, 0x0010000b, &yamaha_terratec_spec),
0440     /* YAMAHA, GO46 */
0441     SND_BEBOB_DEV_ENTRY(VEN_YAMAHA, 0x0010000c, &yamaha_terratec_spec),
0442     /* Focusrite, SaffirePro 26 I/O */
0443     SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, 0x00000003, &saffirepro_26_spec),
0444     /* Focusrite, SaffirePro 10 I/O */
0445     SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, 0x000006, &saffirepro_10_spec),
0446     /* Focusrite, Saffire(no label and LE) */
0447     SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, MODEL_FOCUSRITE_SAFFIRE_BOTH,
0448                 &saffire_spec),
0449     // M-Audio, Firewire 410. The vendor field is left as BridgeCo. AG.
0450     SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010058, NULL),
0451     SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010046, &maudio_fw410_spec),
0452     /* M-Audio, Firewire Audiophile */
0453     SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, MODEL_MAUDIO_AUDIOPHILE_BOTH,
0454                 &maudio_audiophile_spec),
0455     /* M-Audio, Firewire Solo */
0456     SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, 0x00010062, &maudio_solo_spec),
0457     /* M-Audio, Ozonic */
0458     SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, 0x0000000a, &maudio_ozonic_spec),
0459     /* M-Audio NRV10 */
0460     SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, 0x00010081, &maudio_nrv10_spec),
0461     /* M-Audio, ProFireLightbridge */
0462     SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, MODEL_MAUDIO_PROFIRELIGHTBRIDGE, &spec_normal),
0463     /* Firewire 1814 */
0464     SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, 0x00010070, NULL),  /* bootloader */
0465     SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, MODEL_MAUDIO_FW1814,
0466                 &maudio_special_spec),
0467     /* M-Audio ProjectMix */
0468     SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, MODEL_MAUDIO_PROJECTMIX,
0469                 &maudio_special_spec),
0470     /* Digidesign Mbox 2 Pro */
0471     SND_BEBOB_DEV_ENTRY(VEN_DIGIDESIGN, 0x0000a9, &spec_normal),
0472     // Toneweal FW66.
0473     SND_BEBOB_DEV_ENTRY(OUI_SHOUYO, 0x020002, &spec_normal),
0474     /* IDs are unknown but able to be supported */
0475     /*  Apogee, Mini-ME Firewire */
0476     /*  Apogee, Mini-DAC Firewire */
0477     /*  Cakawalk, Sonar Power Studio 66 */
0478     /*  CME, UF400e */
0479     /*  ESI, Quotafire XL */
0480     /*  Infrasonic, DewX */
0481     /*  Infrasonic, Windy6 */
0482     /*  Mackie, Digital X Bus x.200 */
0483     /*  Mackie, Digital X Bus x.400 */
0484     /*  Rolf Spuler, Firewire Guitar */
0485     {}
0486 };
0487 MODULE_DEVICE_TABLE(ieee1394, bebob_id_table);
0488 
0489 static struct fw_driver bebob_driver = {
0490     .driver = {
0491         .owner  = THIS_MODULE,
0492         .name   = KBUILD_MODNAME,
0493         .bus    = &fw_bus_type,
0494     },
0495     .probe    = bebob_probe,
0496     .update   = bebob_update,
0497     .remove   = bebob_remove,
0498     .id_table = bebob_id_table,
0499 };
0500 
0501 static int __init
0502 snd_bebob_init(void)
0503 {
0504     return driver_register(&bebob_driver.driver);
0505 }
0506 
0507 static void __exit
0508 snd_bebob_exit(void)
0509 {
0510     driver_unregister(&bebob_driver.driver);
0511 }
0512 
0513 module_init(snd_bebob_init);
0514 module_exit(snd_bebob_exit);