ALSA: dice: fix detection of Weiss devices

While most DICE devices keep TCAT's default category ID of 0x04, Weiss
devices identify themselves with 0x00.

Reported-by: Rolf Anderegg <rolf.anderegg@weiss.ch>
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
This commit is contained in:
Clemens Ladisch 2012-02-13 21:55:13 +01:00
parent ed7e48264c
commit a471fcde8c

View File

@ -1109,7 +1109,10 @@ static void dice_card_free(struct snd_card *card)
mutex_destroy(&dice->mutex); mutex_destroy(&dice->mutex);
} }
#define OUI_WEISS 0x001c6a
#define DICE_CATEGORY_ID 0x04 #define DICE_CATEGORY_ID 0x04
#define WEISS_CATEGORY_ID 0x00
static int dice_interface_check(struct fw_unit *unit) static int dice_interface_check(struct fw_unit *unit)
{ {
@ -1123,15 +1126,15 @@ static int dice_interface_check(struct fw_unit *unit)
struct fw_device *device = fw_parent_device(unit); struct fw_device *device = fw_parent_device(unit);
struct fw_csr_iterator it; struct fw_csr_iterator it;
int key, value, vendor = -1, model = -1, err; int key, value, vendor = -1, model = -1, err;
unsigned int i; unsigned int category, i;
__be32 pointers[ARRAY_SIZE(min_values)]; __be32 pointers[ARRAY_SIZE(min_values)];
__be32 version; __be32 version;
/* /*
* Check that GUID and unit directory are constructed according to DICE * Check that GUID and unit directory are constructed according to DICE
* rules, i.e., that the specifier ID is the GUID's OUI, and that the * rules, i.e., that the specifier ID is the GUID's OUI, and that the
* GUID chip ID consists of the 8-bit DICE category ID, the 10-bit * GUID chip ID consists of the 8-bit category ID, the 10-bit product
* product ID, and a 22-bit serial number. * ID, and a 22-bit serial number.
*/ */
fw_csr_iterator_init(&it, unit->directory); fw_csr_iterator_init(&it, unit->directory);
while (fw_csr_iterator_next(&it, &key, &value)) { while (fw_csr_iterator_next(&it, &key, &value)) {
@ -1144,7 +1147,11 @@ static int dice_interface_check(struct fw_unit *unit)
break; break;
} }
} }
if (device->config_rom[3] != ((vendor << 8) | DICE_CATEGORY_ID) || if (vendor == OUI_WEISS)
category = WEISS_CATEGORY_ID;
else
category = DICE_CATEGORY_ID;
if (device->config_rom[3] != ((vendor << 8) | category) ||
device->config_rom[4] >> 22 != model) device->config_rom[4] >> 22 != model)
return -ENODEV; return -ENODEV;