diff options
| -rw-r--r-- | sound/pci/hda/hda_codec.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index e067a14a2d9e..20f7762f7144 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -1163,7 +1163,13 @@ int snd_hda_build_controls(struct hda_bus *bus) | |||
| 1163 | /* | 1163 | /* |
| 1164 | * stream formats | 1164 | * stream formats |
| 1165 | */ | 1165 | */ |
| 1166 | static unsigned int rate_bits[][3] = { | 1166 | struct hda_rate_tbl { |
| 1167 | unsigned int hz; | ||
| 1168 | unsigned int alsa_bits; | ||
| 1169 | unsigned int hda_fmt; | ||
| 1170 | }; | ||
| 1171 | |||
| 1172 | static struct hda_rate_tbl rate_bits[] = { | ||
| 1167 | /* rate in Hz, ALSA rate bitmask, HDA format value */ | 1173 | /* rate in Hz, ALSA rate bitmask, HDA format value */ |
| 1168 | 1174 | ||
| 1169 | /* autodetected value used in snd_hda_query_supported_pcm */ | 1175 | /* autodetected value used in snd_hda_query_supported_pcm */ |
| @@ -1181,7 +1187,8 @@ static unsigned int rate_bits[][3] = { | |||
| 1181 | 1187 | ||
| 1182 | /* not autodetected value */ | 1188 | /* not autodetected value */ |
| 1183 | { 9600, SNDRV_PCM_RATE_KNOT, 0x0400 }, /* 1/5 x 48 */ | 1189 | { 9600, SNDRV_PCM_RATE_KNOT, 0x0400 }, /* 1/5 x 48 */ |
| 1184 | { 0 } | 1190 | |
| 1191 | { 0 } /* terminator */ | ||
| 1185 | }; | 1192 | }; |
| 1186 | 1193 | ||
| 1187 | /** | 1194 | /** |
| @@ -1203,12 +1210,12 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate, | |||
| 1203 | int i; | 1210 | int i; |
| 1204 | unsigned int val = 0; | 1211 | unsigned int val = 0; |
| 1205 | 1212 | ||
| 1206 | for (i = 0; rate_bits[i][0]; i++) | 1213 | for (i = 0; rate_bits[i].hz; i++) |
| 1207 | if (rate_bits[i][0] == rate) { | 1214 | if (rate_bits[i].hz == rate) { |
| 1208 | val = rate_bits[i][2]; | 1215 | val = rate_bits[i].hda_fmt; |
| 1209 | break; | 1216 | break; |
| 1210 | } | 1217 | } |
| 1211 | if (! rate_bits[i][0]) { | 1218 | if (! rate_bits[i].hz) { |
| 1212 | snd_printdd("invalid rate %d\n", rate); | 1219 | snd_printdd("invalid rate %d\n", rate); |
| 1213 | return 0; | 1220 | return 0; |
| 1214 | } | 1221 | } |
| @@ -1271,9 +1278,9 @@ int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid, | |||
| 1271 | 1278 | ||
| 1272 | if (ratesp) { | 1279 | if (ratesp) { |
| 1273 | u32 rates = 0; | 1280 | u32 rates = 0; |
| 1274 | for (i = 0; rate_bits[i][0]; i++) { | 1281 | for (i = 0; rate_bits[i].hz; i++) { |
| 1275 | if (val & (1 << i)) | 1282 | if (val & (1 << i)) |
| 1276 | rates |= rate_bits[i][1]; | 1283 | rates |= rate_bits[i].alsa_bits; |
| 1277 | } | 1284 | } |
| 1278 | *ratesp = rates; | 1285 | *ratesp = rates; |
| 1279 | } | 1286 | } |
| @@ -1365,13 +1372,13 @@ int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid, | |||
| 1365 | } | 1372 | } |
| 1366 | 1373 | ||
| 1367 | rate = format & 0xff00; | 1374 | rate = format & 0xff00; |
| 1368 | for (i = 0; rate_bits[i][0]; i++) | 1375 | for (i = 0; rate_bits[i].hz; i++) |
| 1369 | if (rate_bits[i][2] == rate) { | 1376 | if (rate_bits[i].hda_fmt == rate) { |
| 1370 | if (val & (1 << i)) | 1377 | if (val & (1 << i)) |
| 1371 | break; | 1378 | break; |
| 1372 | return 0; | 1379 | return 0; |
| 1373 | } | 1380 | } |
| 1374 | if (! rate_bits[i][0]) | 1381 | if (! rate_bits[i].hz) |
| 1375 | return 0; | 1382 | return 0; |
| 1376 | 1383 | ||
| 1377 | stream = snd_hda_param_read(codec, nid, AC_PAR_STREAM); | 1384 | stream = snd_hda_param_read(codec, nid, AC_PAR_STREAM); |
