Commit a471fcde8c2c4b65f110bb4210af3513ee4deeb8

Authored by Clemens Ladisch
1 parent ed7e48264c

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>

Showing 1 changed file with 12 additions and 5 deletions Side-by-side Diff

sound/firewire/dice.c
... ... @@ -1109,8 +1109,11 @@
1109 1109 mutex_destroy(&dice->mutex);
1110 1110 }
1111 1111  
1112   -#define DICE_CATEGORY_ID 0x04
  1112 +#define OUI_WEISS 0x001c6a
1113 1113  
  1114 +#define DICE_CATEGORY_ID 0x04
  1115 +#define WEISS_CATEGORY_ID 0x00
  1116 +
1114 1117 static int dice_interface_check(struct fw_unit *unit)
1115 1118 {
1116 1119 static const int min_values[10] = {
1117 1120  
... ... @@ -1123,15 +1126,15 @@
1123 1126 struct fw_device *device = fw_parent_device(unit);
1124 1127 struct fw_csr_iterator it;
1125 1128 int key, value, vendor = -1, model = -1, err;
1126   - unsigned int i;
  1129 + unsigned int category, i;
1127 1130 __be32 pointers[ARRAY_SIZE(min_values)];
1128 1131 __be32 version;
1129 1132  
1130 1133 /*
1131 1134 * Check that GUID and unit directory are constructed according to DICE
1132 1135 * rules, i.e., that the specifier ID is the GUID's OUI, and that the
1133   - * GUID chip ID consists of the 8-bit DICE category ID, the 10-bit
1134   - * product ID, and a 22-bit serial number.
  1136 + * GUID chip ID consists of the 8-bit category ID, the 10-bit product
  1137 + * ID, and a 22-bit serial number.
1135 1138 */
1136 1139 fw_csr_iterator_init(&it, unit->directory);
1137 1140 while (fw_csr_iterator_next(&it, &key, &value)) {
... ... @@ -1144,7 +1147,11 @@
1144 1147 break;
1145 1148 }
1146 1149 }
1147   - if (device->config_rom[3] != ((vendor << 8) | DICE_CATEGORY_ID) ||
  1150 + if (vendor == OUI_WEISS)
  1151 + category = WEISS_CATEGORY_ID;
  1152 + else
  1153 + category = DICE_CATEGORY_ID;
  1154 + if (device->config_rom[3] != ((vendor << 8) | category) ||
1148 1155 device->config_rom[4] >> 22 != model)
1149 1156 return -ENODEV;
1150 1157