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:
Родитель
ed7e48264c
Коммит
a471fcde8c
|
@ -1109,7 +1109,10 @@ static void dice_card_free(struct snd_card *card)
|
||||||
mutex_destroy(&dice->mutex);
|
mutex_destroy(&dice->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DICE_CATEGORY_ID 0x04
|
#define OUI_WEISS 0x001c6a
|
||||||
|
|
||||||
|
#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;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче