[alsa-devel] [PATCH 1/8] oxfw: Add skelton for OXFW970/971 based devices
Takashi Sakamoto
o-takashi at sakamocchi.jp
Sun Jan 5 12:13:30 CET 2014
This commit add a new driver for BeBoB based devices with no functionality.
This driver just create/remove card instance according to callbacks.
OXFW970/971 are chipsets produced by Oxford Semiconductor for Multi-Channel
Isochronous Streaming FireWire Audio Controller.
Current supported devices:
- Behringer F-Control Audio 202
- Mackie Onyx-i series (former model)
- Mackie Onyx Satellite
Devices possible to be supported if identifying IDs:
- Mackie, d.2 pro
- Mackie, d.4 pro
- Mackie, U.420
- Mackie, U.420d
- Mackie, Tapco Link.Firewire/
Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
---
sound/firewire/Kconfig | 17 +++++
sound/firewire/Makefile | 1 +
sound/firewire/oxfw/Makefile | 2 +
sound/firewire/oxfw/oxfw.c | 162 +++++++++++++++++++++++++++++++++++++++++++
sound/firewire/oxfw/oxfw.h | 42 +++++++++++
5 files changed, 224 insertions(+)
create mode 100644 sound/firewire/oxfw/Makefile
create mode 100644 sound/firewire/oxfw/oxfw.c
create mode 100644 sound/firewire/oxfw/oxfw.h
diff --git a/sound/firewire/Kconfig b/sound/firewire/Kconfig
index b2c5a7e..f5a466d 100644
--- a/sound/firewire/Kconfig
+++ b/sound/firewire/Kconfig
@@ -117,4 +117,21 @@ config SND_BEBOB
To compile this driver as a module, choose M here: the module
will be called snd-bebob.
+config SND_OXFW
+ tristate "Oxford Semiconductor OXFW970/971 support"
+ select SND_FIREWIRE_LIB
+ select SND_RAWMIDI
+ select SND_PCM
+ select SND_HWDEP
+ help
+ Say Y here to include support for FireWire devices based on
+ Oxford Semiconductor OXFW970/971. SND_FIREWIRE_SPEAKERS also
+ supports this chipset but this driver supports recording devices:
+ * Behringer F-Control Audio 202
+ * Mackie Onyx-i series (former model)
+ * Mackie Onyx Satellite
+
+ To compile this driver as a module, choose M here: the module
+ will be called snd-oxfw.
+
endif # SND_FIREWIRE
diff --git a/sound/firewire/Makefile b/sound/firewire/Makefile
index fad8d49..cbcd6ef 100644
--- a/sound/firewire/Makefile
+++ b/sound/firewire/Makefile
@@ -12,3 +12,4 @@ obj-$(CONFIG_SND_ISIGHT) += snd-isight.o
obj-$(CONFIG_SND_SCS1X) += snd-scs1x.o
obj-$(CONFIG_SND_FIREWORKS) += fireworks/
obj-$(CONFIG_SND_BEBOB) += bebob/
+obj-$(CONFIG_SND_OXFW) += oxfw/
diff --git a/sound/firewire/oxfw/Makefile b/sound/firewire/oxfw/Makefile
new file mode 100644
index 0000000..9ca49c0
--- /dev/null
+++ b/sound/firewire/oxfw/Makefile
@@ -0,0 +1,2 @@
+snd-oxfw-objs := oxfw.o
+obj-m += snd-oxfw.o
diff --git a/sound/firewire/oxfw/oxfw.c b/sound/firewire/oxfw/oxfw.c
new file mode 100644
index 0000000..34be292
--- /dev/null
+++ b/sound/firewire/oxfw/oxfw.c
@@ -0,0 +1,162 @@
+/*
+ * oxfw.c - a part of driver for OXFW970/971 based devices
+ *
+ * Copyright (c) 2013 Takashi Sakamoto
+ *
+ * Licensed under the terms of the GNU General Public License, version 2.
+ */
+
+/*
+ * OXFW970/971 are chipsets produced by Oxford Semiconductor for Multi-Channel
+ * Isochronous Streaming FireWire Audio Controller.
+ */
+#include "oxfw.h"
+
+MODULE_DESCRIPTION("Oxford Semiconductor OXFW970/971 driver");
+MODULE_AUTHOR("Takashi Sakamoto <o-takashi at 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 OXFW970/971 sound card");
+
+static DEFINE_MUTEX(devices_mutex);
+static unsigned int devices_used;
+
+#define VEN_BEHRINGER 0x001564
+#define VEN_LOUD 0x000ff2
+
+static void
+oxfw_card_free(struct snd_card *card)
+{
+ struct snd_oxfw *oxfw = card->private_data;
+
+ if (oxfw->card_index >= 0) {
+ mutex_lock(&devices_mutex);
+ devices_used &= ~BIT(oxfw->card_index);
+ mutex_unlock(&devices_mutex);
+ }
+
+ mutex_destroy(&oxfw->mutex);
+
+ return;
+}
+
+static int
+oxfw_probe(struct fw_unit *unit,
+ const struct ieee1394_device_id *entry)
+{
+ struct snd_card *card;
+ struct snd_oxfw *oxfw;
+ unsigned int card_index;
+ int err;
+
+ mutex_lock(&devices_mutex);
+
+ for (card_index = 0; card_index < SNDRV_CARDS; card_index++) {
+ if (!(devices_used & BIT(card_index)) && enable[card_index])
+ break;
+ }
+ if (card_index >= SNDRV_CARDS) {
+ err = -ENOENT;
+ goto end;
+ }
+
+ err = snd_card_create(index[card_index], id[card_index],
+ THIS_MODULE, sizeof(struct snd_oxfw), &card);
+ if (err < 0)
+ goto end;
+ card->private_free = oxfw_card_free;
+
+ oxfw = card->private_data;
+ oxfw->card = card;
+ oxfw->device = fw_parent_device(unit);
+ oxfw->unit = unit;
+ oxfw->card_index = -1;
+ mutex_init(&oxfw->mutex);
+ spin_lock_init(&oxfw->lock);
+
+ snd_card_set_dev(card, &unit->device);
+ err = snd_card_register(card);
+ if (err < 0) {
+ snd_card_free(card);
+ goto error;
+ }
+ dev_set_drvdata(&unit->device, oxfw);
+ devices_used |= BIT(card_index);
+ oxfw->card_index = card_index;
+end:
+ mutex_unlock(&devices_mutex);
+ return err;
+error:
+ snd_card_free(card);
+ mutex_unlock(&devices_mutex);
+ return err;
+}
+
+static void
+oxfw_update(struct fw_unit *unit)
+{
+ return;
+}
+
+static void
+oxfw_remove(struct fw_unit *unit)
+{
+ struct snd_oxfw *oxfw = dev_get_drvdata(&unit->device);
+
+ snd_card_disconnect(oxfw->card);
+ snd_card_free_when_closed(oxfw->card);
+}
+
+static const struct ieee1394_device_id oxfw_id_table[] = {
+ /* Behringer, F-Control Audio 202 */
+ SND_OXFW_DEV_ENTRY(VEN_BEHRINGER, 0x00fc22),
+ /* Mackie, Onyx-i (former model) */
+ SND_OXFW_DEV_ENTRY(VEN_LOUD, 0x081216),
+ /* Mackie, Onyx Sattelite */
+ SND_OXFW_DEV_ENTRY(VEN_LOUD, 0x00200f),
+ /* IDs are unknown but able to be supported */
+ /* Mackie, d.2 pro */
+ /* Mackie, d.4 pro */
+ /* Mackie, U.420 */
+ /* Mackie, U.420d */
+ /* Mackie, Tapco Link.Firewire */
+ {}
+};
+MODULE_DEVICE_TABLE(ieee1394, oxfw_id_table);
+
+static struct fw_driver oxfw_driver = {
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = KBUILD_MODNAME,
+ .bus = &fw_bus_type,
+ },
+ .probe = oxfw_probe,
+ .update = oxfw_update,
+ .remove = oxfw_remove,
+ .id_table = oxfw_id_table,
+};
+
+static int __init
+snd_oxfw_init(void)
+{
+ return driver_register(&oxfw_driver.driver);
+}
+
+static void __exit
+snd_oxfw_exit(void)
+{
+ driver_unregister(&oxfw_driver.driver);
+ mutex_destroy(&devices_mutex);
+}
+
+module_init(snd_oxfw_init);
+module_exit(snd_oxfw_exit);
diff --git a/sound/firewire/oxfw/oxfw.h b/sound/firewire/oxfw/oxfw.h
new file mode 100644
index 0000000..3aee9e7
--- /dev/null
+++ b/sound/firewire/oxfw/oxfw.h
@@ -0,0 +1,42 @@
+/*
+ * oxford.h - a part of driver for OXFW970/971 based devices
+ *
+ * Copyright (c) 2013 Takashi Sakamoto
+ *
+ * Licensed under the terms of the GNU General Public License, version 2.
+ */
+
+#ifndef SOUND_OXFW_H_INCLUDED
+#define SOUND_OXFW_H_INCLUDED
+
+#include <linux/compat.h>
+#include <linux/device.h>
+#include <linux/firewire.h>
+#include <linux/firewire-constants.h>
+#include <linux/module.h>
+#include <linux/mod_devicetable.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+
+#include <sound/core.h>
+#include <sound/initval.h>
+
+struct snd_oxfw {
+ struct snd_card *card;
+ struct fw_device *device;
+ struct fw_unit *unit;
+ int card_index;
+
+ struct mutex mutex;
+ spinlock_t lock;
+};
+
+#define SND_OXFW_DEV_ENTRY(vendor, model) \
+{ \
+ .match_flags = IEEE1394_MATCH_VENDOR_ID | \
+ IEEE1394_MATCH_MODEL_ID, \
+ .vendor_id = vendor, \
+ .model_id = model, \
+}
+
+#endif
--
1.8.3.2
More information about the Alsa-devel
mailing list