2014-04-25 17:45:14 +04:00
|
|
|
/*
|
|
|
|
* bebob.c - a part of driver for BeBoB based devices
|
|
|
|
*
|
|
|
|
* Copyright (c) 2013-2014 Takashi Sakamoto
|
|
|
|
*
|
|
|
|
* Licensed under the terms of the GNU General Public License, version 2.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* BeBoB is 'BridgeCo enhanced Breakout Box'. This is installed to firewire
|
|
|
|
* devices with DM1000/DM1100/DM1500 chipset. It gives common way for host
|
|
|
|
* system to handle BeBoB based devices.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "bebob.h"
|
|
|
|
|
|
|
|
MODULE_DESCRIPTION("BridgeCo BeBoB driver");
|
|
|
|
MODULE_AUTHOR("Takashi Sakamoto <o-takashi@sakamocchi.jp>");
|
|
|
|
MODULE_LICENSE("GPL v2");
|
|
|
|
|
|
|
|
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
|
|
|
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
|
|
|
|
static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
|
|
|
|
|
|
|
|
module_param_array(index, int, NULL, 0444);
|
|
|
|
MODULE_PARM_DESC(index, "card index");
|
|
|
|
module_param_array(id, charp, NULL, 0444);
|
|
|
|
MODULE_PARM_DESC(id, "ID string");
|
|
|
|
module_param_array(enable, bool, NULL, 0444);
|
|
|
|
MODULE_PARM_DESC(enable, "enable BeBoB sound card");
|
|
|
|
|
|
|
|
static DEFINE_MUTEX(devices_mutex);
|
|
|
|
static DECLARE_BITMAP(devices_used, SNDRV_CARDS);
|
|
|
|
|
|
|
|
/* Offsets from information register. */
|
2015-06-14 06:49:33 +03:00
|
|
|
#define INFO_OFFSET_BEBOB_VERSION 0x08
|
2014-04-25 17:45:14 +04:00
|
|
|
#define INFO_OFFSET_GUID 0x10
|
|
|
|
#define INFO_OFFSET_HW_MODEL_ID 0x18
|
|
|
|
#define INFO_OFFSET_HW_MODEL_REVISION 0x1c
|
|
|
|
|
|
|
|
#define VEN_EDIROL 0x000040ab
|
|
|
|
#define VEN_PRESONUS 0x00000a92
|
|
|
|
#define VEN_BRIDGECO 0x000007f5
|
ALSA: bebob: support Firewire I/O card of Mackie Onyx 1220/1620/1640
Current ALSA BeBoB drivers has an entry for this model, while the value of
vendor ID seems to be wrong according to an user's report.
The vendor had released no updated firmware, thus we can judge that this
model had not changed the content of its config ROM. It's reasonable to fix
the ID according to the report.
$ ./linux-firewire-utils/src/crpp < /sys/bus/firewire/devices/fw1/config_rom
ROM header and bus information block
-----------------------------------------------------------------
400 0425720f bus_info_length 4, crc_length 37, crc 29199
404 31333934 bus_name "1394"
408 f0646122 irmc 1, cmc 1, isc 1, bmc 1, pmc 0, cyc_clk_acc 100,
max_rec 6 (128), max_rom 1, gen 2, spd 2 (S400)
40c 00000ff2 company_id 00000f |
410 00004697 device_id f200004697 | EUI-64 00000ff200004697
root directory
-----------------------------------------------------------------
414 000859be directory_length 8, crc 22974
418 04000082 hardware version
41c 0c0083c0 node capabilities per IEEE 1394
420 03000ff2 vendor
424 8100000a --> descriptor leaf at 44c
428 17010065 model
42c 8100000d --> descriptor leaf at 460
430 13000910 version
434 d1000001 --> unit directory at 438
unit directory at 438
-----------------------------------------------------------------
438 0004ccec directory_length 4, crc 52460
43c 1200a02d specifier id: 1394 TA
440 13010001 version: AV/C
444 17010065 model
448 8100000d --> descriptor leaf at 47c
descriptor leaf at 44c
-----------------------------------------------------------------
44c 0004152a leaf_length 4, crc 5418
450 00000000 textual descriptor
454 00000000 minimal ASCII
458 4d61636b "Mack"
45c 69650000 "ie"
descriptor leaf at 460
-----------------------------------------------------------------
460 000612b5 leaf_length 6, crc 4789
464 00000000 textual descriptor
468 00000000 minimal ASCII
46c 4f6e7978 "Onyx"
470 20466972 " Fir"
474 65776972 "ewir"
478 65000000 "e"
descriptor leaf at 47c
-----------------------------------------------------------------
47c 000612b5 leaf_length 6, crc 4789
480 00000000 textual descriptor
484 00000000 minimal ASCII
488 4f6e7978 "Onyx"
48c 20466972 " Fir"
490 65776972 "ewir"
494 65000000 "e"
$ cat /proc/asound/card3/firewire/firmware
Manufacturer: bridgeCo
Protocol Ver: 1
Build Ver: 0
GUID: 0x00000FF200004697
Model ID: 0x82
Model Rev: 1
Firmware Date: 20040430
Firmware Time: 131527
Firmware ID: 0x10065
Firmware Ver: 2320
Base Addr: 0x20080000
Max Size: 1572864
Loader Date: 20040430
Loader Time: 112036
Reported-by: Andrzej Gansiniec <andrzej@gansiniec.pl>
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2015-10-04 03:17:03 +03:00
|
|
|
#define VEN_MACKIE1 0x0000000f
|
|
|
|
#define VEN_MACKIE2 0x00000ff2
|
2014-04-25 17:45:14 +04:00
|
|
|
#define VEN_STANTON 0x00001260
|
|
|
|
#define VEN_TASCAM 0x0000022e
|
|
|
|
#define VEN_BEHRINGER 0x00001564
|
|
|
|
#define VEN_APOGEE 0x000003db
|
|
|
|
#define VEN_ESI 0x00000f1b
|
|
|
|
#define VEN_ACOUSTIC 0x00000002
|
|
|
|
#define VEN_CME 0x0000000a
|
|
|
|
#define VEN_PHONIC 0x00001496
|
|
|
|
#define VEN_LYNX 0x000019e5
|
|
|
|
#define VEN_ICON 0x00001a9e
|
|
|
|
#define VEN_PRISMSOUND 0x00001198
|
2014-04-25 17:45:22 +04:00
|
|
|
#define VEN_TERRATEC 0x00000aac
|
2014-04-25 17:45:23 +04:00
|
|
|
#define VEN_YAMAHA 0x0000a0de
|
2014-04-25 17:45:24 +04:00
|
|
|
#define VEN_FOCUSRITE 0x0000130e
|
2014-04-25 17:45:25 +04:00
|
|
|
#define VEN_MAUDIO1 0x00000d6c
|
|
|
|
#define VEN_MAUDIO2 0x000007f5
|
2015-05-24 14:51:45 +03:00
|
|
|
#define VEN_DIGIDESIGN 0x00a07e
|
2014-04-25 17:45:24 +04:00
|
|
|
|
|
|
|
#define MODEL_FOCUSRITE_SAFFIRE_BOTH 0x00000000
|
2014-04-25 17:45:25 +04:00
|
|
|
#define MODEL_MAUDIO_AUDIOPHILE_BOTH 0x00010060
|
2014-04-25 17:45:26 +04:00
|
|
|
#define MODEL_MAUDIO_FW1814 0x00010071
|
|
|
|
#define MODEL_MAUDIO_PROJECTMIX 0x00010091
|
2014-04-25 17:45:14 +04:00
|
|
|
|
|
|
|
static int
|
|
|
|
name_device(struct snd_bebob *bebob, unsigned int vendor_id)
|
|
|
|
{
|
|
|
|
struct fw_device *fw_dev = fw_parent_device(bebob->unit);
|
|
|
|
char vendor[24] = {0};
|
|
|
|
char model[32] = {0};
|
2014-05-27 19:14:44 +04:00
|
|
|
u32 hw_id;
|
2014-04-25 17:45:14 +04:00
|
|
|
u32 data[2] = {0};
|
|
|
|
u32 revision;
|
2015-06-14 06:49:33 +03:00
|
|
|
u32 version;
|
2014-04-25 17:45:14 +04:00
|
|
|
int err;
|
|
|
|
|
|
|
|
/* get vendor name from root directory */
|
|
|
|
err = fw_csr_string(fw_dev->config_rom + 5, CSR_VENDOR,
|
|
|
|
vendor, sizeof(vendor));
|
|
|
|
if (err < 0)
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
/* get model name from unit directory */
|
|
|
|
err = fw_csr_string(bebob->unit->directory, CSR_MODEL,
|
|
|
|
model, sizeof(model));
|
|
|
|
if (err < 0)
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
/* get hardware id */
|
|
|
|
err = snd_bebob_read_quad(bebob->unit, INFO_OFFSET_HW_MODEL_ID,
|
2014-05-27 19:14:44 +04:00
|
|
|
&hw_id);
|
2014-04-25 17:45:14 +04:00
|
|
|
if (err < 0)
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
/* get hardware revision */
|
|
|
|
err = snd_bebob_read_quad(bebob->unit, INFO_OFFSET_HW_MODEL_REVISION,
|
|
|
|
&revision);
|
|
|
|
if (err < 0)
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
/* get GUID */
|
|
|
|
err = snd_bebob_read_block(bebob->unit, INFO_OFFSET_GUID,
|
|
|
|
data, sizeof(data));
|
|
|
|
if (err < 0)
|
|
|
|
goto end;
|
|
|
|
|
2015-06-14 06:49:33 +03:00
|
|
|
err = snd_bebob_read_quad(bebob->unit, INFO_OFFSET_BEBOB_VERSION,
|
|
|
|
&version);
|
|
|
|
if (err < 0)
|
|
|
|
goto end;
|
|
|
|
bebob->version = version;
|
|
|
|
|
2014-04-25 17:45:14 +04:00
|
|
|
strcpy(bebob->card->driver, "BeBoB");
|
|
|
|
strcpy(bebob->card->shortname, model);
|
|
|
|
strcpy(bebob->card->mixername, model);
|
|
|
|
snprintf(bebob->card->longname, sizeof(bebob->card->longname),
|
|
|
|
"%s %s (id:%d, rev:%d), GUID %08x%08x at %s, S%d",
|
2014-05-27 19:14:44 +04:00
|
|
|
vendor, model, hw_id, revision,
|
2014-04-25 17:45:14 +04:00
|
|
|
data[0], data[1], dev_name(&bebob->unit->device),
|
|
|
|
100 << fw_dev->max_speed);
|
|
|
|
end:
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2015-02-21 17:54:57 +03:00
|
|
|
/*
|
|
|
|
* This module releases the FireWire unit data after all ALSA character devices
|
|
|
|
* are released by applications. This is for releasing stream data or finishing
|
|
|
|
* transactions safely. Thus at returning from .remove(), this module still keep
|
|
|
|
* references for the unit.
|
|
|
|
*/
|
2014-04-25 17:45:14 +04:00
|
|
|
static void
|
|
|
|
bebob_card_free(struct snd_card *card)
|
|
|
|
{
|
|
|
|
struct snd_bebob *bebob = card->private_data;
|
|
|
|
|
2015-02-21 17:55:00 +03:00
|
|
|
snd_bebob_stream_destroy_duplex(bebob);
|
2015-02-21 17:54:57 +03:00
|
|
|
fw_unit_put(bebob->unit);
|
|
|
|
|
2015-02-21 17:55:00 +03:00
|
|
|
kfree(bebob->maudio_special_quirk);
|
|
|
|
|
2014-04-25 17:45:14 +04:00
|
|
|
if (bebob->card_index >= 0) {
|
|
|
|
mutex_lock(&devices_mutex);
|
|
|
|
clear_bit(bebob->card_index, devices_used);
|
|
|
|
mutex_unlock(&devices_mutex);
|
|
|
|
}
|
|
|
|
|
|
|
|
mutex_destroy(&bebob->mutex);
|
|
|
|
}
|
|
|
|
|
2014-04-25 17:45:24 +04:00
|
|
|
static const struct snd_bebob_spec *
|
|
|
|
get_saffire_spec(struct fw_unit *unit)
|
|
|
|
{
|
|
|
|
char name[24] = {0};
|
|
|
|
|
|
|
|
if (fw_csr_string(unit->directory, CSR_MODEL, name, sizeof(name)) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (strcmp(name, "SaffireLE") == 0)
|
|
|
|
return &saffire_le_spec;
|
|
|
|
else
|
|
|
|
return &saffire_spec;
|
|
|
|
}
|
|
|
|
|
2014-04-25 17:45:25 +04:00
|
|
|
static bool
|
|
|
|
check_audiophile_booted(struct fw_unit *unit)
|
|
|
|
{
|
|
|
|
char name[24] = {0};
|
|
|
|
|
|
|
|
if (fw_csr_string(unit->directory, CSR_MODEL, name, sizeof(name)) < 0)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return strncmp(name, "FW Audiophile Bootloader", 15) != 0;
|
|
|
|
}
|
|
|
|
|
2014-04-25 17:45:14 +04:00
|
|
|
static int
|
|
|
|
bebob_probe(struct fw_unit *unit,
|
|
|
|
const struct ieee1394_device_id *entry)
|
|
|
|
{
|
|
|
|
struct snd_card *card;
|
|
|
|
struct snd_bebob *bebob;
|
2014-04-25 17:45:21 +04:00
|
|
|
const struct snd_bebob_spec *spec;
|
2014-04-25 17:45:14 +04:00
|
|
|
unsigned int card_index;
|
|
|
|
int err;
|
|
|
|
|
|
|
|
mutex_lock(&devices_mutex);
|
|
|
|
|
|
|
|
for (card_index = 0; card_index < SNDRV_CARDS; card_index++) {
|
|
|
|
if (!test_bit(card_index, devices_used) && enable[card_index])
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (card_index >= SNDRV_CARDS) {
|
|
|
|
err = -ENOENT;
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
2014-04-25 17:45:24 +04:00
|
|
|
if ((entry->vendor_id == VEN_FOCUSRITE) &&
|
2014-04-25 17:45:29 +04:00
|
|
|
(entry->model_id == MODEL_FOCUSRITE_SAFFIRE_BOTH))
|
2014-04-25 17:45:24 +04:00
|
|
|
spec = get_saffire_spec(unit);
|
2014-04-25 17:45:29 +04:00
|
|
|
else if ((entry->vendor_id == VEN_MAUDIO1) &&
|
|
|
|
(entry->model_id == MODEL_MAUDIO_AUDIOPHILE_BOTH) &&
|
|
|
|
!check_audiophile_booted(unit))
|
|
|
|
spec = NULL;
|
|
|
|
else
|
2014-04-25 17:45:24 +04:00
|
|
|
spec = (const struct snd_bebob_spec *)entry->driver_data;
|
2014-04-25 17:45:29 +04:00
|
|
|
|
2014-04-25 17:45:21 +04:00
|
|
|
if (spec == NULL) {
|
2014-04-25 17:45:29 +04:00
|
|
|
if ((entry->vendor_id == VEN_MAUDIO1) ||
|
|
|
|
(entry->vendor_id == VEN_MAUDIO2))
|
|
|
|
err = snd_bebob_maudio_load_firmware(unit);
|
|
|
|
else
|
|
|
|
err = -ENOSYS;
|
2014-04-25 17:45:21 +04:00
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
2014-04-25 17:45:14 +04:00
|
|
|
err = snd_card_new(&unit->device, index[card_index], id[card_index],
|
|
|
|
THIS_MODULE, sizeof(struct snd_bebob), &card);
|
|
|
|
if (err < 0)
|
|
|
|
goto end;
|
|
|
|
bebob = card->private_data;
|
|
|
|
bebob->card_index = card_index;
|
|
|
|
set_bit(card_index, devices_used);
|
|
|
|
card->private_free = bebob_card_free;
|
|
|
|
|
|
|
|
bebob->card = card;
|
2015-02-21 17:54:57 +03:00
|
|
|
bebob->unit = fw_unit_get(unit);
|
2014-04-25 17:45:21 +04:00
|
|
|
bebob->spec = spec;
|
2014-04-25 17:45:14 +04:00
|
|
|
mutex_init(&bebob->mutex);
|
|
|
|
spin_lock_init(&bebob->lock);
|
2014-04-25 17:45:20 +04:00
|
|
|
init_waitqueue_head(&bebob->hwdep_wait);
|
2014-04-25 17:45:14 +04:00
|
|
|
|
|
|
|
err = name_device(bebob, entry->vendor_id);
|
|
|
|
if (err < 0)
|
|
|
|
goto error;
|
|
|
|
|
2014-04-25 17:45:26 +04:00
|
|
|
if ((entry->vendor_id == VEN_MAUDIO1) &&
|
|
|
|
(entry->model_id == MODEL_MAUDIO_FW1814))
|
|
|
|
err = snd_bebob_maudio_special_discover(bebob, true);
|
|
|
|
else if ((entry->vendor_id == VEN_MAUDIO1) &&
|
|
|
|
(entry->model_id == MODEL_MAUDIO_PROJECTMIX))
|
|
|
|
err = snd_bebob_maudio_special_discover(bebob, false);
|
|
|
|
else
|
|
|
|
err = snd_bebob_stream_discover(bebob);
|
2014-04-25 17:45:14 +04:00
|
|
|
if (err < 0)
|
|
|
|
goto error;
|
2014-04-25 17:45:15 +04:00
|
|
|
|
2014-04-25 17:45:17 +04:00
|
|
|
snd_bebob_proc_init(bebob);
|
|
|
|
|
2014-04-25 17:45:18 +04:00
|
|
|
if ((bebob->midi_input_ports > 0) ||
|
|
|
|
(bebob->midi_output_ports > 0)) {
|
|
|
|
err = snd_bebob_create_midi_devices(bebob);
|
|
|
|
if (err < 0)
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
2014-04-25 17:45:19 +04:00
|
|
|
err = snd_bebob_create_pcm_devices(bebob);
|
|
|
|
if (err < 0)
|
|
|
|
goto error;
|
|
|
|
|
2014-04-25 17:45:20 +04:00
|
|
|
err = snd_bebob_create_hwdep_device(bebob);
|
|
|
|
if (err < 0)
|
|
|
|
goto error;
|
|
|
|
|
2014-04-25 17:45:15 +04:00
|
|
|
err = snd_bebob_stream_init_duplex(bebob);
|
|
|
|
if (err < 0)
|
|
|
|
goto error;
|
|
|
|
|
2014-04-25 17:45:30 +04:00
|
|
|
if (!bebob->maudio_special_quirk) {
|
|
|
|
err = snd_card_register(card);
|
|
|
|
if (err < 0) {
|
|
|
|
snd_bebob_stream_destroy_duplex(bebob);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* This is a workaround. This bus reset seems to have an effect
|
|
|
|
* to make devices correctly handling transactions. Without
|
|
|
|
* this, the devices have gap_count mismatch. This causes much
|
|
|
|
* failure of transaction.
|
|
|
|
*
|
|
|
|
* Just after registration, user-land application receive
|
|
|
|
* signals from dbus and starts I/Os. To avoid I/Os till the
|
|
|
|
* future bus reset, registration is done in next update().
|
|
|
|
*/
|
|
|
|
bebob->deferred_registration = true;
|
|
|
|
fw_schedule_bus_reset(fw_parent_device(bebob->unit)->card,
|
|
|
|
false, true);
|
2014-04-25 17:45:15 +04:00
|
|
|
}
|
|
|
|
|
2014-04-25 17:45:14 +04:00
|
|
|
dev_set_drvdata(&unit->device, bebob);
|
|
|
|
end:
|
|
|
|
mutex_unlock(&devices_mutex);
|
|
|
|
return err;
|
|
|
|
error:
|
|
|
|
mutex_unlock(&devices_mutex);
|
|
|
|
snd_card_free(card);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2016-02-20 10:18:59 +03:00
|
|
|
/*
|
|
|
|
* This driver doesn't update streams in bus reset handler.
|
|
|
|
*
|
|
|
|
* DM1000/ DM1100/DM1500 chipsets with BeBoB firmware transfer packets with
|
|
|
|
* discontinued counter at bus reset. This discontinuity is immediately
|
|
|
|
* detected in packet streaming layer, then it sets XRUN to PCM substream.
|
|
|
|
*
|
|
|
|
* ALSA PCM applications can know the XRUN by getting -EPIPE from PCM operation.
|
|
|
|
* Then, they can recover the PCM substream by executing ioctl(2) with
|
|
|
|
* SNDRV_PCM_IOCTL_PREPARE. 'struct snd_pcm_ops.prepare' is called and drivers
|
|
|
|
* restart packet streaming.
|
|
|
|
*
|
|
|
|
* The above processing may be executed before this bus-reset handler is
|
|
|
|
* executed. When this handler updates streams with current isochronous
|
|
|
|
* channels, the streams already have the current ones.
|
|
|
|
*/
|
2014-04-25 17:45:14 +04:00
|
|
|
static void
|
|
|
|
bebob_update(struct fw_unit *unit)
|
|
|
|
{
|
|
|
|
struct snd_bebob *bebob = dev_get_drvdata(&unit->device);
|
2014-04-25 17:45:25 +04:00
|
|
|
|
|
|
|
if (bebob == NULL)
|
|
|
|
return;
|
|
|
|
|
2014-04-25 17:45:14 +04:00
|
|
|
fcp_bus_reset(bebob->unit);
|
ALSA: bebob: simplify bus-reset handling
At bus-reset, DM1000/DM1100/DM1500 chipsets transfer packets with
discontinuous value in 'dbc' field of CIP header. In this case, packet
streaming layer in firewire-lib module stops streaming and set XRUN to PCM
substream.
In ALSA, PCM applications are notified the XRUN status by the return value
of ALSA PCM interface. They can recover this state by executing
snd_pcm_prepare(), then PCM drivers' prepare handler is called, and start
new PCM substream. For ALSA BeBoB driver, the handler establishes new
connections and start new AMDTP streaming.
Unfortunately, neither the PCM applications nor the driver know the reason
of XRUN. The driver gets to know the reason when update handler is called
by IEEE 1394 bus driver. As long as I tested, the order of below events are
not fixed:
* Detecting packet discontinuity in tasklet context of OHCI 1394 driver
* Calling prepare handler in process context of ALSA PCM application
* Calling update handler in kthread context of IEEE 1394 bus driver
The unpredictable order is disadvantage for the driver to be compliant to
CMP. In IEC 61883-1, new CMP establish operations should be done 1 sec
(isoc_resource_delay) after bus-reset. Within 1 sec, CMP restore
operations are allowed. For this reason, in former commit ('b6bc812327aa:
ALSA: bebob/firewire-lib: Add a quirk for discontinuity at bus reset'),
the process context is forced to wait for executing update handler. The
process context wait for bus-reset up to 1 sec. This commit solves the
issue, while causes more disadvantages. For PCM applications, calling
snd_pcm_prepare() for recovering XRUN state takes more time and the driver
got a bit complicated code, while the recovery is not always successful.
As long as I tested, DM1000/DM1100/DM1500 and BeBoB firmware can allow
drivers to establish new connections just after bus reset. Furthermore,
any FCP transactions are handled correctly. Therefore, the driver don't
need to wait for bus reset handler for starting new streaming.
This commit removes the codes to reduce maintenance cost.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2016-02-20 10:18:56 +03:00
|
|
|
|
2014-04-25 17:45:30 +04:00
|
|
|
if (bebob->deferred_registration) {
|
|
|
|
if (snd_card_register(bebob->card) < 0) {
|
|
|
|
snd_bebob_stream_destroy_duplex(bebob);
|
|
|
|
snd_card_free(bebob->card);
|
|
|
|
}
|
|
|
|
bebob->deferred_registration = false;
|
|
|
|
}
|
2014-04-25 17:45:14 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void bebob_remove(struct fw_unit *unit)
|
|
|
|
{
|
|
|
|
struct snd_bebob *bebob = dev_get_drvdata(&unit->device);
|
2014-04-25 17:45:25 +04:00
|
|
|
|
|
|
|
if (bebob == NULL)
|
|
|
|
return;
|
|
|
|
|
2015-02-21 17:54:57 +03:00
|
|
|
/* No need to wait for releasing card object in this context. */
|
2014-04-25 17:45:14 +04:00
|
|
|
snd_card_free_when_closed(bebob->card);
|
|
|
|
}
|
|
|
|
|
2015-10-11 09:10:55 +03:00
|
|
|
static const struct snd_bebob_rate_spec normal_rate_spec = {
|
2014-04-25 17:45:21 +04:00
|
|
|
.get = &snd_bebob_stream_get_rate,
|
|
|
|
.set = &snd_bebob_stream_set_rate
|
|
|
|
};
|
|
|
|
static const struct snd_bebob_spec spec_normal = {
|
|
|
|
.clock = NULL,
|
|
|
|
.rate = &normal_rate_spec,
|
|
|
|
.meter = NULL
|
|
|
|
};
|
|
|
|
|
2014-04-25 17:45:14 +04:00
|
|
|
static const struct ieee1394_device_id bebob_id_table[] = {
|
|
|
|
/* Edirol, FA-66 */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_EDIROL, 0x00010049, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Edirol, FA-101 */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_EDIROL, 0x00010048, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Presonus, FIREBOX */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_PRESONUS, 0x00010000, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* PreSonus, FIREPOD/FP10 */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_PRESONUS, 0x00010066, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* PreSonus, Inspire1394 */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_PRESONUS, 0x00010001, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* BridgeCo, RDAudio1 */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010048, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* BridgeCo, Audio5 */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010049, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Mackie, Onyx 1220/1620/1640 (Firewire I/O Card) */
|
ALSA: bebob: support Firewire I/O card of Mackie Onyx 1220/1620/1640
Current ALSA BeBoB drivers has an entry for this model, while the value of
vendor ID seems to be wrong according to an user's report.
The vendor had released no updated firmware, thus we can judge that this
model had not changed the content of its config ROM. It's reasonable to fix
the ID according to the report.
$ ./linux-firewire-utils/src/crpp < /sys/bus/firewire/devices/fw1/config_rom
ROM header and bus information block
-----------------------------------------------------------------
400 0425720f bus_info_length 4, crc_length 37, crc 29199
404 31333934 bus_name "1394"
408 f0646122 irmc 1, cmc 1, isc 1, bmc 1, pmc 0, cyc_clk_acc 100,
max_rec 6 (128), max_rom 1, gen 2, spd 2 (S400)
40c 00000ff2 company_id 00000f |
410 00004697 device_id f200004697 | EUI-64 00000ff200004697
root directory
-----------------------------------------------------------------
414 000859be directory_length 8, crc 22974
418 04000082 hardware version
41c 0c0083c0 node capabilities per IEEE 1394
420 03000ff2 vendor
424 8100000a --> descriptor leaf at 44c
428 17010065 model
42c 8100000d --> descriptor leaf at 460
430 13000910 version
434 d1000001 --> unit directory at 438
unit directory at 438
-----------------------------------------------------------------
438 0004ccec directory_length 4, crc 52460
43c 1200a02d specifier id: 1394 TA
440 13010001 version: AV/C
444 17010065 model
448 8100000d --> descriptor leaf at 47c
descriptor leaf at 44c
-----------------------------------------------------------------
44c 0004152a leaf_length 4, crc 5418
450 00000000 textual descriptor
454 00000000 minimal ASCII
458 4d61636b "Mack"
45c 69650000 "ie"
descriptor leaf at 460
-----------------------------------------------------------------
460 000612b5 leaf_length 6, crc 4789
464 00000000 textual descriptor
468 00000000 minimal ASCII
46c 4f6e7978 "Onyx"
470 20466972 " Fir"
474 65776972 "ewir"
478 65000000 "e"
descriptor leaf at 47c
-----------------------------------------------------------------
47c 000612b5 leaf_length 6, crc 4789
480 00000000 textual descriptor
484 00000000 minimal ASCII
488 4f6e7978 "Onyx"
48c 20466972 " Fir"
490 65776972 "ewir"
494 65000000 "e"
$ cat /proc/asound/card3/firewire/firmware
Manufacturer: bridgeCo
Protocol Ver: 1
Build Ver: 0
GUID: 0x00000FF200004697
Model ID: 0x82
Model Rev: 1
Firmware Date: 20040430
Firmware Time: 131527
Firmware ID: 0x10065
Firmware Ver: 2320
Base Addr: 0x20080000
Max Size: 1572864
Loader Date: 20040430
Loader Time: 112036
Reported-by: Andrzej Gansiniec <andrzej@gansiniec.pl>
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2015-10-04 03:17:03 +03:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MACKIE2, 0x00010065, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Mackie, d.2 (Firewire Option) */
|
ALSA: bebob: support Firewire I/O card of Mackie Onyx 1220/1620/1640
Current ALSA BeBoB drivers has an entry for this model, while the value of
vendor ID seems to be wrong according to an user's report.
The vendor had released no updated firmware, thus we can judge that this
model had not changed the content of its config ROM. It's reasonable to fix
the ID according to the report.
$ ./linux-firewire-utils/src/crpp < /sys/bus/firewire/devices/fw1/config_rom
ROM header and bus information block
-----------------------------------------------------------------
400 0425720f bus_info_length 4, crc_length 37, crc 29199
404 31333934 bus_name "1394"
408 f0646122 irmc 1, cmc 1, isc 1, bmc 1, pmc 0, cyc_clk_acc 100,
max_rec 6 (128), max_rom 1, gen 2, spd 2 (S400)
40c 00000ff2 company_id 00000f |
410 00004697 device_id f200004697 | EUI-64 00000ff200004697
root directory
-----------------------------------------------------------------
414 000859be directory_length 8, crc 22974
418 04000082 hardware version
41c 0c0083c0 node capabilities per IEEE 1394
420 03000ff2 vendor
424 8100000a --> descriptor leaf at 44c
428 17010065 model
42c 8100000d --> descriptor leaf at 460
430 13000910 version
434 d1000001 --> unit directory at 438
unit directory at 438
-----------------------------------------------------------------
438 0004ccec directory_length 4, crc 52460
43c 1200a02d specifier id: 1394 TA
440 13010001 version: AV/C
444 17010065 model
448 8100000d --> descriptor leaf at 47c
descriptor leaf at 44c
-----------------------------------------------------------------
44c 0004152a leaf_length 4, crc 5418
450 00000000 textual descriptor
454 00000000 minimal ASCII
458 4d61636b "Mack"
45c 69650000 "ie"
descriptor leaf at 460
-----------------------------------------------------------------
460 000612b5 leaf_length 6, crc 4789
464 00000000 textual descriptor
468 00000000 minimal ASCII
46c 4f6e7978 "Onyx"
470 20466972 " Fir"
474 65776972 "ewir"
478 65000000 "e"
descriptor leaf at 47c
-----------------------------------------------------------------
47c 000612b5 leaf_length 6, crc 4789
480 00000000 textual descriptor
484 00000000 minimal ASCII
488 4f6e7978 "Onyx"
48c 20466972 " Fir"
490 65776972 "ewir"
494 65000000 "e"
$ cat /proc/asound/card3/firewire/firmware
Manufacturer: bridgeCo
Protocol Ver: 1
Build Ver: 0
GUID: 0x00000FF200004697
Model ID: 0x82
Model Rev: 1
Firmware Date: 20040430
Firmware Time: 131527
Firmware ID: 0x10065
Firmware Ver: 2320
Base Addr: 0x20080000
Max Size: 1572864
Loader Date: 20040430
Loader Time: 112036
Reported-by: Andrzej Gansiniec <andrzej@gansiniec.pl>
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2015-10-04 03:17:03 +03:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MACKIE1, 0x00010067, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Stanton, ScratchAmp */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_STANTON, 0x00000001, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Tascam, IF-FW DM */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_TASCAM, 0x00010067, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Behringer, XENIX UFX 1204 */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x00001204, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Behringer, XENIX UFX 1604 */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x00001604, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Behringer, Digital Mixer X32 series (X-UF Card) */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x00000006, &spec_normal),
|
2015-06-14 06:49:37 +03:00
|
|
|
/* Behringer, F-Control Audio 1616 */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x001616, &spec_normal),
|
|
|
|
/* Behringer, F-Control Audio 610 */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_BEHRINGER, 0x000610, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Apogee Electronics, Rosetta 200/400 (X-FireWire card) */
|
|
|
|
/* Apogee Electronics, DA/AD/DD-16X (X-FireWire card) */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_APOGEE, 0x00010048, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Apogee Electronics, Ensemble */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_APOGEE, 0x00001eee, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* ESI, Quatafire610 */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_ESI, 0x00010064, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* AcousticReality, eARMasterOne */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_ACOUSTIC, 0x00000002, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* CME, MatrixKFW */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_CME, 0x00030000, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Phonic, Helix Board 12 MkII */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00050000, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Phonic, Helix Board 18 MkII */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00060000, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Phonic, Helix Board 24 MkII */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00070000, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Phonic, Helix Board 12 Universal/18 Universal/24 Universal */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_PHONIC, 0x00000000, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* Lynx, Aurora 8/16 (LT-FW) */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_LYNX, 0x00000001, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* ICON, FireXon */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_ICON, 0x00000001, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* PrismSound, Orpheus */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_PRISMSOUND, 0x00010048, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* PrismSound, ADA-8XR */
|
2014-04-25 17:45:21 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_PRISMSOUND, 0x0000ada8, &spec_normal),
|
2014-04-25 17:45:22 +04:00
|
|
|
/* TerraTec Electronic GmbH, PHASE 88 Rack FW */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000003, &phase88_rack_spec),
|
|
|
|
/* TerraTec Electronic GmbH, PHASE 24 FW */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000004, &phase24_series_spec),
|
|
|
|
/* TerraTec Electronic GmbH, Phase X24 FW */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000007, &phase24_series_spec),
|
|
|
|
/* TerraTec Electronic GmbH, EWS MIC2/MIC8 */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000005, &spec_normal),
|
|
|
|
/* Terratec Electronic GmbH, Aureon 7.1 Firewire */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_TERRATEC, 0x00000002, &spec_normal),
|
2014-04-25 17:45:23 +04:00
|
|
|
/* Yamaha, GO44 */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_YAMAHA, 0x0010000b, &yamaha_go_spec),
|
|
|
|
/* YAMAHA, GO46 */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_YAMAHA, 0x0010000c, &yamaha_go_spec),
|
2014-04-25 17:45:24 +04:00
|
|
|
/* Focusrite, SaffirePro 26 I/O */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, 0x00000003, &saffirepro_26_spec),
|
|
|
|
/* Focusrite, SaffirePro 10 I/O */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, 0x00000006, &saffirepro_10_spec),
|
|
|
|
/* Focusrite, Saffire(no label and LE) */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, MODEL_FOCUSRITE_SAFFIRE_BOTH,
|
|
|
|
&saffire_spec),
|
2014-04-25 17:45:25 +04:00
|
|
|
/* M-Audio, Firewire 410 */
|
2014-04-25 17:45:29 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MAUDIO2, 0x00010058, NULL), /* bootloader */
|
2014-04-25 17:45:25 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MAUDIO2, 0x00010046, &maudio_fw410_spec),
|
|
|
|
/* M-Audio, Firewire Audiophile */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MAUDIO1, MODEL_MAUDIO_AUDIOPHILE_BOTH,
|
|
|
|
&maudio_audiophile_spec),
|
|
|
|
/* M-Audio, Firewire Solo */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MAUDIO1, 0x00010062, &maudio_solo_spec),
|
|
|
|
/* M-Audio, Ozonic */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MAUDIO1, 0x0000000a, &maudio_ozonic_spec),
|
|
|
|
/* M-Audio NRV10 */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MAUDIO1, 0x00010081, &maudio_nrv10_spec),
|
|
|
|
/* M-Audio, ProFireLightbridge */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MAUDIO1, 0x000100a1, &spec_normal),
|
2014-04-25 17:45:26 +04:00
|
|
|
/* Firewire 1814 */
|
2014-04-25 17:45:29 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MAUDIO1, 0x00010070, NULL), /* bootloader */
|
2014-04-25 17:45:26 +04:00
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MAUDIO1, MODEL_MAUDIO_FW1814,
|
|
|
|
&maudio_special_spec),
|
|
|
|
/* M-Audio ProjectMix */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_MAUDIO1, MODEL_MAUDIO_PROJECTMIX,
|
|
|
|
&maudio_special_spec),
|
2015-05-24 14:51:45 +03:00
|
|
|
/* Digidesign Mbox 2 Pro */
|
|
|
|
SND_BEBOB_DEV_ENTRY(VEN_DIGIDESIGN, 0x0000a9, &spec_normal),
|
2014-04-25 17:45:14 +04:00
|
|
|
/* IDs are unknown but able to be supported */
|
|
|
|
/* Apogee, Mini-ME Firewire */
|
|
|
|
/* Apogee, Mini-DAC Firewire */
|
|
|
|
/* Cakawalk, Sonar Power Studio 66 */
|
|
|
|
/* CME, UF400e */
|
|
|
|
/* ESI, Quotafire XL */
|
|
|
|
/* Infrasonic, DewX */
|
|
|
|
/* Infrasonic, Windy6 */
|
|
|
|
/* Mackie, Digital X Bus x.200 */
|
|
|
|
/* Mackie, Digital X Bus x.400 */
|
|
|
|
/* Phonic, HB 12 */
|
|
|
|
/* Phonic, HB 24 */
|
|
|
|
/* Phonic, HB 18 */
|
|
|
|
/* Phonic, FireFly 202 */
|
|
|
|
/* Phonic, FireFly 302 */
|
|
|
|
/* Rolf Spuler, Firewire Guitar */
|
|
|
|
{}
|
|
|
|
};
|
|
|
|
MODULE_DEVICE_TABLE(ieee1394, bebob_id_table);
|
|
|
|
|
|
|
|
static struct fw_driver bebob_driver = {
|
|
|
|
.driver = {
|
|
|
|
.owner = THIS_MODULE,
|
|
|
|
.name = "snd-bebob",
|
|
|
|
.bus = &fw_bus_type,
|
|
|
|
},
|
|
|
|
.probe = bebob_probe,
|
|
|
|
.update = bebob_update,
|
|
|
|
.remove = bebob_remove,
|
|
|
|
.id_table = bebob_id_table,
|
|
|
|
};
|
|
|
|
|
|
|
|
static int __init
|
|
|
|
snd_bebob_init(void)
|
|
|
|
{
|
|
|
|
return driver_register(&bebob_driver.driver);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void __exit
|
|
|
|
snd_bebob_exit(void)
|
|
|
|
{
|
|
|
|
driver_unregister(&bebob_driver.driver);
|
|
|
|
}
|
|
|
|
|
|
|
|
module_init(snd_bebob_init);
|
|
|
|
module_exit(snd_bebob_exit);
|