0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
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
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
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
0085 err = fw_csr_string(bebob->unit->directory, CSR_MODEL,
0086 model, sizeof(model));
0087 if (err < 0)
0088 goto end;
0089
0090
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
0097 err = snd_bebob_read_quad(bebob->unit, INFO_OFFSET_HW_MODEL_REVISION,
0098 &revision);
0099 if (err < 0)
0100 goto end;
0101
0102
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
0166
0167
0168 bebob->quirks |= SND_BEBOB_QUIRK_INITIAL_DISCONTINUOUS_DBC;
0169 break;
0170 case MODEL_MAUDIO_FW1814:
0171 case MODEL_MAUDIO_PROJECTMIX:
0172
0173
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
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
0287
0288
0289
0290
0291
0292
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
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
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
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
0353
0354
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
0368 SND_BEBOB_DEV_ENTRY(VEN_EDIROL, 0x00010049, &spec_normal),
0369
0370 SND_BEBOB_DEV_ENTRY(VEN_EDIROL, 0x00010048, &spec_normal),
0371
0372 SND_BEBOB_DEV_ENTRY(VEN_PRESONUS, 0x00010000, &spec_normal),
0373
0374 SND_BEBOB_DEV_ENTRY(VEN_PRESONUS, 0x00010066, &spec_normal),
0375
0376 SND_BEBOB_DEV_ENTRY(VEN_PRESONUS, 0x00010001, &spec_normal),
0377
0378 SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010048, &spec_normal),
0379
0380 SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010049, &spec_normal),
0381
0382 SND_BEBOB_DEV_ENTRY(VEN_MACKIE, 0x00010065, &spec_normal),
0383
0384 SND_BEBOB_DEV_ENTRY(VEN_MACKIE, 0x00010067, &spec_normal),
0385
0386 SND_BEBOB_DEV_ENTRY(VEN_STANTON, 0x00000001, &spec_normal),
0387
0388 SND_BEBOB_DEV_ENTRY(VEN_TASCAM, 0x00010067, &spec_normal),
0389
0390 SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x00001204, &spec_normal),
0391
0392 SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x00001604, &spec_normal),
0393
0394 SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x00000006, &spec_normal),
0395
0396 SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x001616, &spec_normal),
0397
0398 SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x000610, &spec_normal),
0399
0400
0401 SND_BEBOB_DEV_ENTRY(VEN_APOGEE, 0x00010048, &spec_normal),
0402
0403 SND_BEBOB_DEV_ENTRY(VEN_APOGEE, 0x01eeee, &spec_normal),
0404
0405 SND_BEBOB_DEV_ENTRY(VEN_ESI, 0x00010064, &spec_normal),
0406
0407 SND_BEBOB_DEV_ENTRY(VEN_CME, 0x00030000, &spec_normal),
0408
0409 SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00050000, &spec_normal),
0410
0411 SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00060000, &spec_normal),
0412
0413 SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00070000, &spec_normal),
0414
0415 SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00080000, &spec_normal),
0416
0417
0418 SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00000000, &spec_normal),
0419
0420 SND_BEBOB_DEV_ENTRY(VEN_LYNX, 0x00000001, &spec_normal),
0421
0422 SND_BEBOB_DEV_ENTRY(VEN_ICON, 0x00000001, &spec_normal),
0423
0424 SND_BEBOB_DEV_ENTRY(VEN_PRISMSOUND, 0x00010048, &spec_normal),
0425
0426 SND_BEBOB_DEV_ENTRY(VEN_PRISMSOUND, 0x0000ada8, &spec_normal),
0427
0428 SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000003, &phase88_rack_spec),
0429
0430 SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000004, &yamaha_terratec_spec),
0431
0432 SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000007, &yamaha_terratec_spec),
0433
0434 SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000005, &spec_normal),
0435
0436
0437 SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000002, &spec_normal),
0438
0439 SND_BEBOB_DEV_ENTRY(VEN_YAMAHA, 0x0010000b, &yamaha_terratec_spec),
0440
0441 SND_BEBOB_DEV_ENTRY(VEN_YAMAHA, 0x0010000c, &yamaha_terratec_spec),
0442
0443 SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, 0x00000003, &saffirepro_26_spec),
0444
0445 SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, 0x000006, &saffirepro_10_spec),
0446
0447 SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, MODEL_FOCUSRITE_SAFFIRE_BOTH,
0448 &saffire_spec),
0449
0450 SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010058, NULL),
0451 SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010046, &maudio_fw410_spec),
0452
0453 SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, MODEL_MAUDIO_AUDIOPHILE_BOTH,
0454 &maudio_audiophile_spec),
0455
0456 SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, 0x00010062, &maudio_solo_spec),
0457
0458 SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, 0x0000000a, &maudio_ozonic_spec),
0459
0460 SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, 0x00010081, &maudio_nrv10_spec),
0461
0462 SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, MODEL_MAUDIO_PROFIRELIGHTBRIDGE, &spec_normal),
0463
0464 SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, 0x00010070, NULL),
0465 SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, MODEL_MAUDIO_FW1814,
0466 &maudio_special_spec),
0467
0468 SND_BEBOB_DEV_ENTRY(VEN_MAUDIO, MODEL_MAUDIO_PROJECTMIX,
0469 &maudio_special_spec),
0470
0471 SND_BEBOB_DEV_ENTRY(VEN_DIGIDESIGN, 0x0000a9, &spec_normal),
0472
0473 SND_BEBOB_DEV_ENTRY(OUI_SHOUYO, 0x020002, &spec_normal),
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
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);