ALSA: dice: restrict the driver to playback-only devices
authorClemens Ladisch <clemens@ladisch.de>
Tue, 15 Oct 2013 18:26:05 +0000 (20:26 +0200)
committerClemens Ladisch <clemens@ladisch.de>
Sun, 20 Oct 2013 20:07:57 +0000 (22:07 +0200)
At the moment, this driver supports only playback, while FFADO supports
(only) full-duplex devices.  So, prevent conflicts by not claiming
devices that would be better handled by FFADO.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
sound/firewire/Kconfig
sound/firewire/dice.c

index 915330989412e0c04723ec1436d4aa79a12cdc46..b3e274fe4a77438a463766c9d364045dbe8cbaf7 100644 (file)
@@ -12,14 +12,16 @@ config SND_FIREWIRE_LIB
        depends on SND_PCM
 
 config SND_DICE
-       tristate "DICE devices (EXPERIMENTAL)"
+       tristate "DICE-based DACs (EXPERIMENTAL)"
        select SND_HWDEP
        select SND_PCM
        select SND_FIREWIRE_LIB
        help
-         Say Y here to include support for many FireWire audio interfaces
-         based on the DICE chip family (DICE-II/Jr/Mini) from TC Applied
-         Technologies.
+         Say Y here to include support for many DACs based on the DICE
+         chip family (DICE-II/Jr/Mini) from TC Applied Technologies.
+
+         At the moment, this driver supports playback only.  If you
+         want to use devices that support capturing, use FFADO instead.
 
          To compile this driver as a module, choose M here: the module
          will be called snd-dice.
index 49d630ba2d9fbd3e8be1026daf72f366bfa514e0..6feee6614193a88d894c8f3e4f4942074523e4e6 100644 (file)
@@ -1128,6 +1128,7 @@ static int dice_interface_check(struct fw_unit *unit)
        int key, value, vendor = -1, model = -1, err;
        unsigned int category, i;
        __be32 pointers[ARRAY_SIZE(min_values)];
+       __be32 tx_data[4];
        __be32 version;
 
        /*
@@ -1171,6 +1172,14 @@ static int dice_interface_check(struct fw_unit *unit)
                        return -ENODEV;
        }
 
+       /* We support playback only. Let capture devices be handled by FFADO. */
+       err = snd_fw_transaction(unit, TCODE_READ_BLOCK_REQUEST,
+                                DICE_PRIVATE_SPACE +
+                                be32_to_cpu(pointers[2]) * 4,
+                                tx_data, sizeof(tx_data), 0);
+       if (err < 0 || (tx_data[0] && tx_data[3]))
+               return -ENODEV;
+
        /*
         * Check that the implemented DICE driver specification major version
         * number matches.