diff options
Diffstat (limited to 'sound/pci/hda/hda_codec.c')
-rw-r--r-- | sound/pci/hda/hda_codec.c | 432 |
1 files changed, 391 insertions, 41 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 5e21b35207ab..e344235da491 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -94,6 +94,13 @@ static void hda_keep_power_on(struct hda_codec *codec); | |||
94 | static inline void hda_keep_power_on(struct hda_codec *codec) {} | 94 | static inline void hda_keep_power_on(struct hda_codec *codec) {} |
95 | #endif | 95 | #endif |
96 | 96 | ||
97 | /** | ||
98 | * snd_hda_get_jack_location - Give a location string of the jack | ||
99 | * @cfg: pin default config value | ||
100 | * | ||
101 | * Parse the pin default config value and returns the string of the | ||
102 | * jack location, e.g. "Rear", "Front", etc. | ||
103 | */ | ||
97 | const char *snd_hda_get_jack_location(u32 cfg) | 104 | const char *snd_hda_get_jack_location(u32 cfg) |
98 | { | 105 | { |
99 | static char *bases[7] = { | 106 | static char *bases[7] = { |
@@ -121,6 +128,13 @@ const char *snd_hda_get_jack_location(u32 cfg) | |||
121 | } | 128 | } |
122 | EXPORT_SYMBOL_HDA(snd_hda_get_jack_location); | 129 | EXPORT_SYMBOL_HDA(snd_hda_get_jack_location); |
123 | 130 | ||
131 | /** | ||
132 | * snd_hda_get_jack_connectivity - Give a connectivity string of the jack | ||
133 | * @cfg: pin default config value | ||
134 | * | ||
135 | * Parse the pin default config value and returns the string of the | ||
136 | * jack connectivity, i.e. external or internal connection. | ||
137 | */ | ||
124 | const char *snd_hda_get_jack_connectivity(u32 cfg) | 138 | const char *snd_hda_get_jack_connectivity(u32 cfg) |
125 | { | 139 | { |
126 | static char *jack_locations[4] = { "Ext", "Int", "Sep", "Oth" }; | 140 | static char *jack_locations[4] = { "Ext", "Int", "Sep", "Oth" }; |
@@ -129,6 +143,13 @@ const char *snd_hda_get_jack_connectivity(u32 cfg) | |||
129 | } | 143 | } |
130 | EXPORT_SYMBOL_HDA(snd_hda_get_jack_connectivity); | 144 | EXPORT_SYMBOL_HDA(snd_hda_get_jack_connectivity); |
131 | 145 | ||
146 | /** | ||
147 | * snd_hda_get_jack_type - Give a type string of the jack | ||
148 | * @cfg: pin default config value | ||
149 | * | ||
150 | * Parse the pin default config value and returns the string of the | ||
151 | * jack type, i.e. the purpose of the jack, such as Line-Out or CD. | ||
152 | */ | ||
132 | const char *snd_hda_get_jack_type(u32 cfg) | 153 | const char *snd_hda_get_jack_type(u32 cfg) |
133 | { | 154 | { |
134 | static char *jack_types[16] = { | 155 | static char *jack_types[16] = { |
@@ -822,6 +843,16 @@ int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list, | |||
822 | return 0; | 843 | return 0; |
823 | } | 844 | } |
824 | 845 | ||
846 | /** | ||
847 | * snd_hda_codec_set_pincfg - Override a pin default configuration | ||
848 | * @codec: the HDA codec | ||
849 | * @nid: NID to set the pin config | ||
850 | * @cfg: the pin default config value | ||
851 | * | ||
852 | * Override a pin default configuration value in the cache. | ||
853 | * This value can be read by snd_hda_codec_get_pincfg() in a higher | ||
854 | * priority than the real hardware value. | ||
855 | */ | ||
825 | int snd_hda_codec_set_pincfg(struct hda_codec *codec, | 856 | int snd_hda_codec_set_pincfg(struct hda_codec *codec, |
826 | hda_nid_t nid, unsigned int cfg) | 857 | hda_nid_t nid, unsigned int cfg) |
827 | { | 858 | { |
@@ -829,7 +860,15 @@ int snd_hda_codec_set_pincfg(struct hda_codec *codec, | |||
829 | } | 860 | } |
830 | EXPORT_SYMBOL_HDA(snd_hda_codec_set_pincfg); | 861 | EXPORT_SYMBOL_HDA(snd_hda_codec_set_pincfg); |
831 | 862 | ||
832 | /* get the current pin config value of the given pin NID */ | 863 | /** |
864 | * snd_hda_codec_get_pincfg - Obtain a pin-default configuration | ||
865 | * @codec: the HDA codec | ||
866 | * @nid: NID to get the pin config | ||
867 | * | ||
868 | * Get the current pin config value of the given pin NID. | ||
869 | * If the pincfg value is cached or overridden via sysfs or driver, | ||
870 | * returns the cached value. | ||
871 | */ | ||
833 | unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid) | 872 | unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid) |
834 | { | 873 | { |
835 | struct hda_pincfg *pin; | 874 | struct hda_pincfg *pin; |
@@ -1028,6 +1067,15 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr | |||
1028 | } | 1067 | } |
1029 | EXPORT_SYMBOL_HDA(snd_hda_codec_new); | 1068 | EXPORT_SYMBOL_HDA(snd_hda_codec_new); |
1030 | 1069 | ||
1070 | /** | ||
1071 | * snd_hda_codec_configure - (Re-)configure the HD-audio codec | ||
1072 | * @codec: the HDA codec | ||
1073 | * | ||
1074 | * Start parsing of the given codec tree and (re-)initialize the whole | ||
1075 | * patch instance. | ||
1076 | * | ||
1077 | * Returns 0 if successful or a negative error code. | ||
1078 | */ | ||
1031 | int snd_hda_codec_configure(struct hda_codec *codec) | 1079 | int snd_hda_codec_configure(struct hda_codec *codec) |
1032 | { | 1080 | { |
1033 | int err; | 1081 | int err; |
@@ -1090,6 +1138,11 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
1090 | } | 1138 | } |
1091 | EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); | 1139 | EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); |
1092 | 1140 | ||
1141 | /** | ||
1142 | * snd_hda_codec_cleanup_stream - clean up the codec for closing | ||
1143 | * @codec: the CODEC to clean up | ||
1144 | * @nid: the NID to clean up | ||
1145 | */ | ||
1093 | void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid) | 1146 | void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid) |
1094 | { | 1147 | { |
1095 | if (!nid) | 1148 | if (!nid) |
@@ -1165,8 +1218,17 @@ get_alloc_amp_hash(struct hda_codec *codec, u32 key) | |||
1165 | return (struct hda_amp_info *)get_alloc_hash(&codec->amp_cache, key); | 1218 | return (struct hda_amp_info *)get_alloc_hash(&codec->amp_cache, key); |
1166 | } | 1219 | } |
1167 | 1220 | ||
1168 | /* | 1221 | /** |
1169 | * query AMP capabilities for the given widget and direction | 1222 | * query_amp_caps - query AMP capabilities |
1223 | * @codec: the HD-auio codec | ||
1224 | * @nid: the NID to query | ||
1225 | * @direction: either #HDA_INPUT or #HDA_OUTPUT | ||
1226 | * | ||
1227 | * Query AMP capabilities for the given widget and direction. | ||
1228 | * Returns the obtained capability bits. | ||
1229 | * | ||
1230 | * When cap bits have been already read, this doesn't read again but | ||
1231 | * returns the cached value. | ||
1170 | */ | 1232 | */ |
1171 | u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction) | 1233 | u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction) |
1172 | { | 1234 | { |
@@ -1189,6 +1251,19 @@ u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction) | |||
1189 | } | 1251 | } |
1190 | EXPORT_SYMBOL_HDA(query_amp_caps); | 1252 | EXPORT_SYMBOL_HDA(query_amp_caps); |
1191 | 1253 | ||
1254 | /** | ||
1255 | * snd_hda_override_amp_caps - Override the AMP capabilities | ||
1256 | * @codec: the CODEC to clean up | ||
1257 | * @nid: the NID to clean up | ||
1258 | * @direction: either #HDA_INPUT or #HDA_OUTPUT | ||
1259 | * @caps: the capability bits to set | ||
1260 | * | ||
1261 | * Override the cached AMP caps bits value by the given one. | ||
1262 | * This function is useful if the driver needs to adjust the AMP ranges, | ||
1263 | * e.g. limit to 0dB, etc. | ||
1264 | * | ||
1265 | * Returns zero if successful or a negative error code. | ||
1266 | */ | ||
1192 | int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, | 1267 | int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, |
1193 | unsigned int caps) | 1268 | unsigned int caps) |
1194 | { | 1269 | { |
@@ -1224,6 +1299,17 @@ static unsigned int read_pin_cap(struct hda_codec *codec, hda_nid_t nid) | |||
1224 | return snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); | 1299 | return snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); |
1225 | } | 1300 | } |
1226 | 1301 | ||
1302 | /** | ||
1303 | * snd_hda_query_pin_caps - Query PIN capabilities | ||
1304 | * @codec: the HD-auio codec | ||
1305 | * @nid: the NID to query | ||
1306 | * | ||
1307 | * Query PIN capabilities for the given widget. | ||
1308 | * Returns the obtained capability bits. | ||
1309 | * | ||
1310 | * When cap bits have been already read, this doesn't read again but | ||
1311 | * returns the cached value. | ||
1312 | */ | ||
1227 | u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid) | 1313 | u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid) |
1228 | { | 1314 | { |
1229 | return query_caps_hash(codec, nid, HDA_HASH_PINCAP_KEY(nid), | 1315 | return query_caps_hash(codec, nid, HDA_HASH_PINCAP_KEY(nid), |
@@ -1271,8 +1357,15 @@ static void put_vol_mute(struct hda_codec *codec, struct hda_amp_info *info, | |||
1271 | info->vol[ch] = val; | 1357 | info->vol[ch] = val; |
1272 | } | 1358 | } |
1273 | 1359 | ||
1274 | /* | 1360 | /** |
1275 | * read AMP value. The volume is between 0 to 0x7f, 0x80 = mute bit. | 1361 | * snd_hda_codec_amp_read - Read AMP value |
1362 | * @codec: HD-audio codec | ||
1363 | * @nid: NID to read the AMP value | ||
1364 | * @ch: channel (left=0 or right=1) | ||
1365 | * @direction: #HDA_INPUT or #HDA_OUTPUT | ||
1366 | * @index: the index value (only for input direction) | ||
1367 | * | ||
1368 | * Read AMP value. The volume is between 0 to 0x7f, 0x80 = mute bit. | ||
1276 | */ | 1369 | */ |
1277 | int snd_hda_codec_amp_read(struct hda_codec *codec, hda_nid_t nid, int ch, | 1370 | int snd_hda_codec_amp_read(struct hda_codec *codec, hda_nid_t nid, int ch, |
1278 | int direction, int index) | 1371 | int direction, int index) |
@@ -1285,8 +1378,18 @@ int snd_hda_codec_amp_read(struct hda_codec *codec, hda_nid_t nid, int ch, | |||
1285 | } | 1378 | } |
1286 | EXPORT_SYMBOL_HDA(snd_hda_codec_amp_read); | 1379 | EXPORT_SYMBOL_HDA(snd_hda_codec_amp_read); |
1287 | 1380 | ||
1288 | /* | 1381 | /** |
1289 | * update the AMP value, mask = bit mask to set, val = the value | 1382 | * snd_hda_codec_amp_update - update the AMP value |
1383 | * @codec: HD-audio codec | ||
1384 | * @nid: NID to read the AMP value | ||
1385 | * @ch: channel (left=0 or right=1) | ||
1386 | * @direction: #HDA_INPUT or #HDA_OUTPUT | ||
1387 | * @idx: the index value (only for input direction) | ||
1388 | * @mask: bit mask to set | ||
1389 | * @val: the bits value to set | ||
1390 | * | ||
1391 | * Update the AMP value with a bit mask. | ||
1392 | * Returns 0 if the value is unchanged, 1 if changed. | ||
1290 | */ | 1393 | */ |
1291 | int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid, int ch, | 1394 | int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid, int ch, |
1292 | int direction, int idx, int mask, int val) | 1395 | int direction, int idx, int mask, int val) |
@@ -1305,8 +1408,17 @@ int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid, int ch, | |||
1305 | } | 1408 | } |
1306 | EXPORT_SYMBOL_HDA(snd_hda_codec_amp_update); | 1409 | EXPORT_SYMBOL_HDA(snd_hda_codec_amp_update); |
1307 | 1410 | ||
1308 | /* | 1411 | /** |
1309 | * update the AMP stereo with the same mask and value | 1412 | * snd_hda_codec_amp_stereo - update the AMP stereo values |
1413 | * @codec: HD-audio codec | ||
1414 | * @nid: NID to read the AMP value | ||
1415 | * @direction: #HDA_INPUT or #HDA_OUTPUT | ||
1416 | * @idx: the index value (only for input direction) | ||
1417 | * @mask: bit mask to set | ||
1418 | * @val: the bits value to set | ||
1419 | * | ||
1420 | * Update the AMP values like snd_hda_codec_amp_update(), but for a | ||
1421 | * stereo widget with the same mask and value. | ||
1310 | */ | 1422 | */ |
1311 | int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid, | 1423 | int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid, |
1312 | int direction, int idx, int mask, int val) | 1424 | int direction, int idx, int mask, int val) |
@@ -1320,7 +1432,12 @@ int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid, | |||
1320 | EXPORT_SYMBOL_HDA(snd_hda_codec_amp_stereo); | 1432 | EXPORT_SYMBOL_HDA(snd_hda_codec_amp_stereo); |
1321 | 1433 | ||
1322 | #ifdef SND_HDA_NEEDS_RESUME | 1434 | #ifdef SND_HDA_NEEDS_RESUME |
1323 | /* resume the all amp commands from the cache */ | 1435 | /** |
1436 | * snd_hda_codec_resume_amp - Resume all AMP commands from the cache | ||
1437 | * @codec: HD-audio codec | ||
1438 | * | ||
1439 | * Resume the all amp commands from the cache. | ||
1440 | */ | ||
1324 | void snd_hda_codec_resume_amp(struct hda_codec *codec) | 1441 | void snd_hda_codec_resume_amp(struct hda_codec *codec) |
1325 | { | 1442 | { |
1326 | struct hda_amp_info *buffer = codec->amp_cache.buf.list; | 1443 | struct hda_amp_info *buffer = codec->amp_cache.buf.list; |
@@ -1346,7 +1463,12 @@ void snd_hda_codec_resume_amp(struct hda_codec *codec) | |||
1346 | EXPORT_SYMBOL_HDA(snd_hda_codec_resume_amp); | 1463 | EXPORT_SYMBOL_HDA(snd_hda_codec_resume_amp); |
1347 | #endif /* SND_HDA_NEEDS_RESUME */ | 1464 | #endif /* SND_HDA_NEEDS_RESUME */ |
1348 | 1465 | ||
1349 | /* volume */ | 1466 | /** |
1467 | * snd_hda_mixer_amp_volume_info - Info callback for a standard AMP mixer | ||
1468 | * | ||
1469 | * The control element is supposed to have the private_value field | ||
1470 | * set up via HDA_COMPOSE_AMP_VAL*() or related macros. | ||
1471 | */ | ||
1350 | int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol, | 1472 | int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol, |
1351 | struct snd_ctl_elem_info *uinfo) | 1473 | struct snd_ctl_elem_info *uinfo) |
1352 | { | 1474 | { |
@@ -1402,6 +1524,12 @@ update_amp_value(struct hda_codec *codec, hda_nid_t nid, | |||
1402 | HDA_AMP_VOLMASK, val); | 1524 | HDA_AMP_VOLMASK, val); |
1403 | } | 1525 | } |
1404 | 1526 | ||
1527 | /** | ||
1528 | * snd_hda_mixer_amp_volume_get - Get callback for a standard AMP mixer volume | ||
1529 | * | ||
1530 | * The control element is supposed to have the private_value field | ||
1531 | * set up via HDA_COMPOSE_AMP_VAL*() or related macros. | ||
1532 | */ | ||
1405 | int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol, | 1533 | int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol, |
1406 | struct snd_ctl_elem_value *ucontrol) | 1534 | struct snd_ctl_elem_value *ucontrol) |
1407 | { | 1535 | { |
@@ -1421,6 +1549,12 @@ int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol, | |||
1421 | } | 1549 | } |
1422 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_volume_get); | 1550 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_volume_get); |
1423 | 1551 | ||
1552 | /** | ||
1553 | * snd_hda_mixer_amp_volume_put - Put callback for a standard AMP mixer volume | ||
1554 | * | ||
1555 | * The control element is supposed to have the private_value field | ||
1556 | * set up via HDA_COMPOSE_AMP_VAL*() or related macros. | ||
1557 | */ | ||
1424 | int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol, | 1558 | int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol, |
1425 | struct snd_ctl_elem_value *ucontrol) | 1559 | struct snd_ctl_elem_value *ucontrol) |
1426 | { | 1560 | { |
@@ -1445,6 +1579,12 @@ int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol, | |||
1445 | } | 1579 | } |
1446 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_volume_put); | 1580 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_volume_put); |
1447 | 1581 | ||
1582 | /** | ||
1583 | * snd_hda_mixer_amp_volume_put - TLV callback for a standard AMP mixer volume | ||
1584 | * | ||
1585 | * The control element is supposed to have the private_value field | ||
1586 | * set up via HDA_COMPOSE_AMP_VAL*() or related macros. | ||
1587 | */ | ||
1448 | int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag, | 1588 | int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag, |
1449 | unsigned int size, unsigned int __user *_tlv) | 1589 | unsigned int size, unsigned int __user *_tlv) |
1450 | { | 1590 | { |
@@ -1474,8 +1614,16 @@ int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag, | |||
1474 | } | 1614 | } |
1475 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_tlv); | 1615 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_tlv); |
1476 | 1616 | ||
1477 | /* | 1617 | /** |
1478 | * set (static) TLV for virtual master volume; recalculated as max 0dB | 1618 | * snd_hda_set_vmaster_tlv - Set TLV for a virtual master control |
1619 | * @codec: HD-audio codec | ||
1620 | * @nid: NID of a reference widget | ||
1621 | * @dir: #HDA_INPUT or #HDA_OUTPUT | ||
1622 | * @tlv: TLV data to be stored, at least 4 elements | ||
1623 | * | ||
1624 | * Set (static) TLV data for a virtual master volume using the AMP caps | ||
1625 | * obtained from the reference NID. | ||
1626 | * The volume range is recalculated as if the max volume is 0dB. | ||
1479 | */ | 1627 | */ |
1480 | void snd_hda_set_vmaster_tlv(struct hda_codec *codec, hda_nid_t nid, int dir, | 1628 | void snd_hda_set_vmaster_tlv(struct hda_codec *codec, hda_nid_t nid, int dir, |
1481 | unsigned int *tlv) | 1629 | unsigned int *tlv) |
@@ -1509,6 +1657,13 @@ _snd_hda_find_mixer_ctl(struct hda_codec *codec, | |||
1509 | return snd_ctl_find_id(codec->bus->card, &id); | 1657 | return snd_ctl_find_id(codec->bus->card, &id); |
1510 | } | 1658 | } |
1511 | 1659 | ||
1660 | /** | ||
1661 | * snd_hda_find_mixer_ctl - Find a mixer control element with the given name | ||
1662 | * @codec: HD-audio codec | ||
1663 | * @name: ctl id name string | ||
1664 | * | ||
1665 | * Get the control element with the given id string and IFACE_MIXER. | ||
1666 | */ | ||
1512 | struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec, | 1667 | struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec, |
1513 | const char *name) | 1668 | const char *name) |
1514 | { | 1669 | { |
@@ -1516,7 +1671,24 @@ struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec, | |||
1516 | } | 1671 | } |
1517 | EXPORT_SYMBOL_HDA(snd_hda_find_mixer_ctl); | 1672 | EXPORT_SYMBOL_HDA(snd_hda_find_mixer_ctl); |
1518 | 1673 | ||
1519 | /* Add a control element and assign to the codec */ | 1674 | /** |
1675 | * snd_hda_ctl-add - Add a control element and assign to the codec | ||
1676 | * @codec: HD-audio codec | ||
1677 | * @nid: corresponding NID (optional) | ||
1678 | * @kctl: the control element to assign | ||
1679 | * | ||
1680 | * Add the given control element to an array inside the codec instance. | ||
1681 | * All control elements belonging to a codec are supposed to be added | ||
1682 | * by this function so that a proper clean-up works at the free or | ||
1683 | * reconfiguration time. | ||
1684 | * | ||
1685 | * If non-zero @nid is passed, the NID is assigned to the control element. | ||
1686 | * The assignment is shown in the codec proc file. | ||
1687 | * | ||
1688 | * snd_hda_ctl_add() checks the control subdev id field whether | ||
1689 | * #HDA_SUBDEV_NID_FLAG bit is set. If set (and @nid is zero), the lower | ||
1690 | * bits value is taken as the NID to assign. | ||
1691 | */ | ||
1520 | int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid, | 1692 | int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid, |
1521 | struct snd_kcontrol *kctl) | 1693 | struct snd_kcontrol *kctl) |
1522 | { | 1694 | { |
@@ -1540,7 +1712,10 @@ int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid, | |||
1540 | } | 1712 | } |
1541 | EXPORT_SYMBOL_HDA(snd_hda_ctl_add); | 1713 | EXPORT_SYMBOL_HDA(snd_hda_ctl_add); |
1542 | 1714 | ||
1543 | /* Clear all controls assigned to the given codec */ | 1715 | /** |
1716 | * snd_hda_ctls_clear - Clear all controls assigned to the given codec | ||
1717 | * @codec: HD-audio codec | ||
1718 | */ | ||
1544 | void snd_hda_ctls_clear(struct hda_codec *codec) | 1719 | void snd_hda_ctls_clear(struct hda_codec *codec) |
1545 | { | 1720 | { |
1546 | int i; | 1721 | int i; |
@@ -1572,6 +1747,16 @@ static void hda_unlock_devices(struct snd_card *card) | |||
1572 | spin_unlock(&card->files_lock); | 1747 | spin_unlock(&card->files_lock); |
1573 | } | 1748 | } |
1574 | 1749 | ||
1750 | /** | ||
1751 | * snd_hda_codec_reset - Clear all objects assigned to the codec | ||
1752 | * @codec: HD-audio codec | ||
1753 | * | ||
1754 | * This frees the all PCM and control elements assigned to the codec, and | ||
1755 | * clears the caches and restores the pin default configurations. | ||
1756 | * | ||
1757 | * When a device is being used, it returns -EBSY. If successfully freed, | ||
1758 | * returns zero. | ||
1759 | */ | ||
1575 | int snd_hda_codec_reset(struct hda_codec *codec) | 1760 | int snd_hda_codec_reset(struct hda_codec *codec) |
1576 | { | 1761 | { |
1577 | struct snd_card *card = codec->bus->card; | 1762 | struct snd_card *card = codec->bus->card; |
@@ -1635,7 +1820,22 @@ int snd_hda_codec_reset(struct hda_codec *codec) | |||
1635 | return 0; | 1820 | return 0; |
1636 | } | 1821 | } |
1637 | 1822 | ||
1638 | /* create a virtual master control and add slaves */ | 1823 | /** |
1824 | * snd_hda_add_vmaster - create a virtual master control and add slaves | ||
1825 | * @codec: HD-audio codec | ||
1826 | * @name: vmaster control name | ||
1827 | * @tlv: TLV data (optional) | ||
1828 | * @slaves: slave control names (optional) | ||
1829 | * | ||
1830 | * Create a virtual master control with the given name. The TLV data | ||
1831 | * must be either NULL or a valid data. | ||
1832 | * | ||
1833 | * @slaves is a NULL-terminated array of strings, each of which is a | ||
1834 | * slave control name. All controls with these names are assigned to | ||
1835 | * the new virtual master control. | ||
1836 | * | ||
1837 | * This function returns zero if successful or a negative error code. | ||
1838 | */ | ||
1639 | int snd_hda_add_vmaster(struct hda_codec *codec, char *name, | 1839 | int snd_hda_add_vmaster(struct hda_codec *codec, char *name, |
1640 | unsigned int *tlv, const char **slaves) | 1840 | unsigned int *tlv, const char **slaves) |
1641 | { | 1841 | { |
@@ -1677,7 +1877,12 @@ int snd_hda_add_vmaster(struct hda_codec *codec, char *name, | |||
1677 | } | 1877 | } |
1678 | EXPORT_SYMBOL_HDA(snd_hda_add_vmaster); | 1878 | EXPORT_SYMBOL_HDA(snd_hda_add_vmaster); |
1679 | 1879 | ||
1680 | /* switch */ | 1880 | /** |
1881 | * snd_hda_mixer_amp_switch_info - Info callback for a standard AMP mixer switch | ||
1882 | * | ||
1883 | * The control element is supposed to have the private_value field | ||
1884 | * set up via HDA_COMPOSE_AMP_VAL*() or related macros. | ||
1885 | */ | ||
1681 | int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol, | 1886 | int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol, |
1682 | struct snd_ctl_elem_info *uinfo) | 1887 | struct snd_ctl_elem_info *uinfo) |
1683 | { | 1888 | { |
@@ -1691,6 +1896,12 @@ int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol, | |||
1691 | } | 1896 | } |
1692 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_info); | 1897 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_info); |
1693 | 1898 | ||
1899 | /** | ||
1900 | * snd_hda_mixer_amp_switch_get - Get callback for a standard AMP mixer switch | ||
1901 | * | ||
1902 | * The control element is supposed to have the private_value field | ||
1903 | * set up via HDA_COMPOSE_AMP_VAL*() or related macros. | ||
1904 | */ | ||
1694 | int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol, | 1905 | int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol, |
1695 | struct snd_ctl_elem_value *ucontrol) | 1906 | struct snd_ctl_elem_value *ucontrol) |
1696 | { | 1907 | { |
@@ -1711,6 +1922,12 @@ int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol, | |||
1711 | } | 1922 | } |
1712 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_get); | 1923 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_get); |
1713 | 1924 | ||
1925 | /** | ||
1926 | * snd_hda_mixer_amp_switch_put - Put callback for a standard AMP mixer switch | ||
1927 | * | ||
1928 | * The control element is supposed to have the private_value field | ||
1929 | * set up via HDA_COMPOSE_AMP_VAL*() or related macros. | ||
1930 | */ | ||
1714 | int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol, | 1931 | int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol, |
1715 | struct snd_ctl_elem_value *ucontrol) | 1932 | struct snd_ctl_elem_value *ucontrol) |
1716 | { | 1933 | { |
@@ -1742,6 +1959,12 @@ int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol, | |||
1742 | } | 1959 | } |
1743 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_put); | 1960 | EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_put); |
1744 | 1961 | ||
1962 | /** | ||
1963 | * snd_hda_mixer_amp_switch_put_beep - Put callback for a beep AMP switch | ||
1964 | * | ||
1965 | * This function calls snd_hda_enable_beep_device(), which behaves differently | ||
1966 | * depending on beep_mode option. | ||
1967 | */ | ||
1745 | int snd_hda_mixer_amp_switch_put_beep(struct snd_kcontrol *kcontrol, | 1968 | int snd_hda_mixer_amp_switch_put_beep(struct snd_kcontrol *kcontrol, |
1746 | struct snd_ctl_elem_value *ucontrol) | 1969 | struct snd_ctl_elem_value *ucontrol) |
1747 | { | 1970 | { |
@@ -1762,6 +1985,12 @@ EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_put_beep); | |||
1762 | #define AMP_VAL_IDX_SHIFT 19 | 1985 | #define AMP_VAL_IDX_SHIFT 19 |
1763 | #define AMP_VAL_IDX_MASK (0x0f<<19) | 1986 | #define AMP_VAL_IDX_MASK (0x0f<<19) |
1764 | 1987 | ||
1988 | /** | ||
1989 | * snd_hda_mixer_bind_switch_get - Get callback for a bound volume control | ||
1990 | * | ||
1991 | * The control element is supposed to have the private_value field | ||
1992 | * set up via HDA_BIND_MUTE*() macros. | ||
1993 | */ | ||
1765 | int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol, | 1994 | int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol, |
1766 | struct snd_ctl_elem_value *ucontrol) | 1995 | struct snd_ctl_elem_value *ucontrol) |
1767 | { | 1996 | { |
@@ -1779,6 +2008,12 @@ int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol, | |||
1779 | } | 2008 | } |
1780 | EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_switch_get); | 2009 | EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_switch_get); |
1781 | 2010 | ||
2011 | /** | ||
2012 | * snd_hda_mixer_bind_switch_put - Put callback for a bound volume control | ||
2013 | * | ||
2014 | * The control element is supposed to have the private_value field | ||
2015 | * set up via HDA_BIND_MUTE*() macros. | ||
2016 | */ | ||
1782 | int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol, | 2017 | int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol, |
1783 | struct snd_ctl_elem_value *ucontrol) | 2018 | struct snd_ctl_elem_value *ucontrol) |
1784 | { | 2019 | { |
@@ -1803,8 +2038,11 @@ int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol, | |||
1803 | } | 2038 | } |
1804 | EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_switch_put); | 2039 | EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_switch_put); |
1805 | 2040 | ||
1806 | /* | 2041 | /** |
1807 | * generic bound volume/swtich controls | 2042 | * snd_hda_mixer_bind_ctls_info - Info callback for a generic bound control |
2043 | * | ||
2044 | * The control element is supposed to have the private_value field | ||
2045 | * set up via HDA_BIND_VOL() or HDA_BIND_SW() macros. | ||
1808 | */ | 2046 | */ |
1809 | int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol, | 2047 | int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol, |
1810 | struct snd_ctl_elem_info *uinfo) | 2048 | struct snd_ctl_elem_info *uinfo) |
@@ -1823,6 +2061,12 @@ int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol, | |||
1823 | } | 2061 | } |
1824 | EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_info); | 2062 | EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_info); |
1825 | 2063 | ||
2064 | /** | ||
2065 | * snd_hda_mixer_bind_ctls_get - Get callback for a generic bound control | ||
2066 | * | ||
2067 | * The control element is supposed to have the private_value field | ||
2068 | * set up via HDA_BIND_VOL() or HDA_BIND_SW() macros. | ||
2069 | */ | ||
1826 | int snd_hda_mixer_bind_ctls_get(struct snd_kcontrol *kcontrol, | 2070 | int snd_hda_mixer_bind_ctls_get(struct snd_kcontrol *kcontrol, |
1827 | struct snd_ctl_elem_value *ucontrol) | 2071 | struct snd_ctl_elem_value *ucontrol) |
1828 | { | 2072 | { |
@@ -1840,6 +2084,12 @@ int snd_hda_mixer_bind_ctls_get(struct snd_kcontrol *kcontrol, | |||
1840 | } | 2084 | } |
1841 | EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_get); | 2085 | EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_get); |
1842 | 2086 | ||
2087 | /** | ||
2088 | * snd_hda_mixer_bind_ctls_put - Put callback for a generic bound control | ||
2089 | * | ||
2090 | * The control element is supposed to have the private_value field | ||
2091 | * set up via HDA_BIND_VOL() or HDA_BIND_SW() macros. | ||
2092 | */ | ||
1843 | int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol, | 2093 | int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol, |
1844 | struct snd_ctl_elem_value *ucontrol) | 2094 | struct snd_ctl_elem_value *ucontrol) |
1845 | { | 2095 | { |
@@ -1863,6 +2113,12 @@ int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol, | |||
1863 | } | 2113 | } |
1864 | EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_put); | 2114 | EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_put); |
1865 | 2115 | ||
2116 | /** | ||
2117 | * snd_hda_mixer_bind_tlv - TLV callback for a generic bound control | ||
2118 | * | ||
2119 | * The control element is supposed to have the private_value field | ||
2120 | * set up via HDA_BIND_VOL() macro. | ||
2121 | */ | ||
1866 | int snd_hda_mixer_bind_tlv(struct snd_kcontrol *kcontrol, int op_flag, | 2122 | int snd_hda_mixer_bind_tlv(struct snd_kcontrol *kcontrol, int op_flag, |
1867 | unsigned int size, unsigned int __user *tlv) | 2123 | unsigned int size, unsigned int __user *tlv) |
1868 | { | 2124 | { |
@@ -2185,6 +2441,11 @@ static struct snd_kcontrol_new spdif_share_sw = { | |||
2185 | .put = spdif_share_sw_put, | 2441 | .put = spdif_share_sw_put, |
2186 | }; | 2442 | }; |
2187 | 2443 | ||
2444 | /** | ||
2445 | * snd_hda_create_spdif_share_sw - create Default PCM switch | ||
2446 | * @codec: the HDA codec | ||
2447 | * @mout: multi-out instance | ||
2448 | */ | ||
2188 | int snd_hda_create_spdif_share_sw(struct hda_codec *codec, | 2449 | int snd_hda_create_spdif_share_sw(struct hda_codec *codec, |
2189 | struct hda_multi_out *mout) | 2450 | struct hda_multi_out *mout) |
2190 | { | 2451 | { |
@@ -2352,7 +2613,12 @@ int snd_hda_codec_write_cache(struct hda_codec *codec, hda_nid_t nid, | |||
2352 | } | 2613 | } |
2353 | EXPORT_SYMBOL_HDA(snd_hda_codec_write_cache); | 2614 | EXPORT_SYMBOL_HDA(snd_hda_codec_write_cache); |
2354 | 2615 | ||
2355 | /* resume the all commands from the cache */ | 2616 | /** |
2617 | * snd_hda_codec_resume_cache - Resume the all commands from the cache | ||
2618 | * @codec: HD-audio codec | ||
2619 | * | ||
2620 | * Execute all verbs recorded in the command caches to resume. | ||
2621 | */ | ||
2356 | void snd_hda_codec_resume_cache(struct hda_codec *codec) | 2622 | void snd_hda_codec_resume_cache(struct hda_codec *codec) |
2357 | { | 2623 | { |
2358 | struct hda_cache_head *buffer = codec->cmd_cache.buf.list; | 2624 | struct hda_cache_head *buffer = codec->cmd_cache.buf.list; |
@@ -2778,8 +3044,12 @@ static int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid, | |||
2778 | } | 3044 | } |
2779 | 3045 | ||
2780 | /** | 3046 | /** |
2781 | * snd_hda_is_supported_format - check whether the given node supports | 3047 | * snd_hda_is_supported_format - Check the validity of the format |
2782 | * the format val | 3048 | * @codec: HD-audio codec |
3049 | * @nid: NID to check | ||
3050 | * @format: the HD-audio format value to check | ||
3051 | * | ||
3052 | * Check whether the given node supports the format value. | ||
2783 | * | 3053 | * |
2784 | * Returns 1 if supported, 0 if not. | 3054 | * Returns 1 if supported, 0 if not. |
2785 | */ | 3055 | */ |
@@ -2899,6 +3169,7 @@ static int set_pcm_default_values(struct hda_codec *codec, | |||
2899 | return 0; | 3169 | return 0; |
2900 | } | 3170 | } |
2901 | 3171 | ||
3172 | /* global */ | ||
2902 | const char *snd_hda_pcm_type_name[HDA_PCM_NTYPES] = { | 3173 | const char *snd_hda_pcm_type_name[HDA_PCM_NTYPES] = { |
2903 | "Audio", "SPDIF", "HDMI", "Modem" | 3174 | "Audio", "SPDIF", "HDMI", "Modem" |
2904 | }; | 3175 | }; |
@@ -3216,6 +3487,7 @@ static void hda_keep_power_on(struct hda_codec *codec) | |||
3216 | codec->power_jiffies = jiffies; | 3487 | codec->power_jiffies = jiffies; |
3217 | } | 3488 | } |
3218 | 3489 | ||
3490 | /* update the power on/off account with the current jiffies */ | ||
3219 | void snd_hda_update_power_acct(struct hda_codec *codec) | 3491 | void snd_hda_update_power_acct(struct hda_codec *codec) |
3220 | { | 3492 | { |
3221 | unsigned long delta = jiffies - codec->power_jiffies; | 3493 | unsigned long delta = jiffies - codec->power_jiffies; |
@@ -3226,6 +3498,13 @@ void snd_hda_update_power_acct(struct hda_codec *codec) | |||
3226 | codec->power_jiffies += delta; | 3498 | codec->power_jiffies += delta; |
3227 | } | 3499 | } |
3228 | 3500 | ||
3501 | /** | ||
3502 | * snd_hda_power_up - Power-up the codec | ||
3503 | * @codec: HD-audio codec | ||
3504 | * | ||
3505 | * Increment the power-up counter and power up the hardware really when | ||
3506 | * not turned on yet. | ||
3507 | */ | ||
3229 | void snd_hda_power_up(struct hda_codec *codec) | 3508 | void snd_hda_power_up(struct hda_codec *codec) |
3230 | { | 3509 | { |
3231 | struct hda_bus *bus = codec->bus; | 3510 | struct hda_bus *bus = codec->bus; |
@@ -3248,9 +3527,13 @@ EXPORT_SYMBOL_HDA(snd_hda_power_up); | |||
3248 | #define power_save(codec) \ | 3527 | #define power_save(codec) \ |
3249 | ((codec)->bus->power_save ? *(codec)->bus->power_save : 0) | 3528 | ((codec)->bus->power_save ? *(codec)->bus->power_save : 0) |
3250 | 3529 | ||
3251 | #define power_save(codec) \ | 3530 | /** |
3252 | ((codec)->bus->power_save ? *(codec)->bus->power_save : 0) | 3531 | * snd_hda_power_down - Power-down the codec |
3253 | 3532 | * @codec: HD-audio codec | |
3533 | * | ||
3534 | * Decrement the power-up counter and schedules the power-off work if | ||
3535 | * the counter rearches to zero. | ||
3536 | */ | ||
3254 | void snd_hda_power_down(struct hda_codec *codec) | 3537 | void snd_hda_power_down(struct hda_codec *codec) |
3255 | { | 3538 | { |
3256 | --codec->power_count; | 3539 | --codec->power_count; |
@@ -3264,6 +3547,19 @@ void snd_hda_power_down(struct hda_codec *codec) | |||
3264 | } | 3547 | } |
3265 | EXPORT_SYMBOL_HDA(snd_hda_power_down); | 3548 | EXPORT_SYMBOL_HDA(snd_hda_power_down); |
3266 | 3549 | ||
3550 | /** | ||
3551 | * snd_hda_check_amp_list_power - Check the amp list and update the power | ||
3552 | * @codec: HD-audio codec | ||
3553 | * @check: the object containing an AMP list and the status | ||
3554 | * @nid: NID to check / update | ||
3555 | * | ||
3556 | * Check whether the given NID is in the amp list. If it's in the list, | ||
3557 | * check the current AMP status, and update the the power-status according | ||
3558 | * to the mute status. | ||
3559 | * | ||
3560 | * This function is supposed to be set or called from the check_power_status | ||
3561 | * patch ops. | ||
3562 | */ | ||
3267 | int snd_hda_check_amp_list_power(struct hda_codec *codec, | 3563 | int snd_hda_check_amp_list_power(struct hda_codec *codec, |
3268 | struct hda_loopback_check *check, | 3564 | struct hda_loopback_check *check, |
3269 | hda_nid_t nid) | 3565 | hda_nid_t nid) |
@@ -3305,6 +3601,10 @@ EXPORT_SYMBOL_HDA(snd_hda_check_amp_list_power); | |||
3305 | /* | 3601 | /* |
3306 | * Channel mode helper | 3602 | * Channel mode helper |
3307 | */ | 3603 | */ |
3604 | |||
3605 | /** | ||
3606 | * snd_hda_ch_mode_info - Info callback helper for the channel mode enum | ||
3607 | */ | ||
3308 | int snd_hda_ch_mode_info(struct hda_codec *codec, | 3608 | int snd_hda_ch_mode_info(struct hda_codec *codec, |
3309 | struct snd_ctl_elem_info *uinfo, | 3609 | struct snd_ctl_elem_info *uinfo, |
3310 | const struct hda_channel_mode *chmode, | 3610 | const struct hda_channel_mode *chmode, |
@@ -3321,6 +3621,9 @@ int snd_hda_ch_mode_info(struct hda_codec *codec, | |||
3321 | } | 3621 | } |
3322 | EXPORT_SYMBOL_HDA(snd_hda_ch_mode_info); | 3622 | EXPORT_SYMBOL_HDA(snd_hda_ch_mode_info); |
3323 | 3623 | ||
3624 | /** | ||
3625 | * snd_hda_ch_mode_get - Get callback helper for the channel mode enum | ||
3626 | */ | ||
3324 | int snd_hda_ch_mode_get(struct hda_codec *codec, | 3627 | int snd_hda_ch_mode_get(struct hda_codec *codec, |
3325 | struct snd_ctl_elem_value *ucontrol, | 3628 | struct snd_ctl_elem_value *ucontrol, |
3326 | const struct hda_channel_mode *chmode, | 3629 | const struct hda_channel_mode *chmode, |
@@ -3339,6 +3642,9 @@ int snd_hda_ch_mode_get(struct hda_codec *codec, | |||
3339 | } | 3642 | } |
3340 | EXPORT_SYMBOL_HDA(snd_hda_ch_mode_get); | 3643 | EXPORT_SYMBOL_HDA(snd_hda_ch_mode_get); |
3341 | 3644 | ||
3645 | /** | ||
3646 | * snd_hda_ch_mode_put - Put callback helper for the channel mode enum | ||
3647 | */ | ||
3342 | int snd_hda_ch_mode_put(struct hda_codec *codec, | 3648 | int snd_hda_ch_mode_put(struct hda_codec *codec, |
3343 | struct snd_ctl_elem_value *ucontrol, | 3649 | struct snd_ctl_elem_value *ucontrol, |
3344 | const struct hda_channel_mode *chmode, | 3650 | const struct hda_channel_mode *chmode, |
@@ -3363,6 +3669,10 @@ EXPORT_SYMBOL_HDA(snd_hda_ch_mode_put); | |||
3363 | /* | 3669 | /* |
3364 | * input MUX helper | 3670 | * input MUX helper |
3365 | */ | 3671 | */ |
3672 | |||
3673 | /** | ||
3674 | * snd_hda_input_mux_info_info - Info callback helper for the input-mux enum | ||
3675 | */ | ||
3366 | int snd_hda_input_mux_info(const struct hda_input_mux *imux, | 3676 | int snd_hda_input_mux_info(const struct hda_input_mux *imux, |
3367 | struct snd_ctl_elem_info *uinfo) | 3677 | struct snd_ctl_elem_info *uinfo) |
3368 | { | 3678 | { |
@@ -3381,6 +3691,9 @@ int snd_hda_input_mux_info(const struct hda_input_mux *imux, | |||
3381 | } | 3691 | } |
3382 | EXPORT_SYMBOL_HDA(snd_hda_input_mux_info); | 3692 | EXPORT_SYMBOL_HDA(snd_hda_input_mux_info); |
3383 | 3693 | ||
3694 | /** | ||
3695 | * snd_hda_input_mux_info_put - Put callback helper for the input-mux enum | ||
3696 | */ | ||
3384 | int snd_hda_input_mux_put(struct hda_codec *codec, | 3697 | int snd_hda_input_mux_put(struct hda_codec *codec, |
3385 | const struct hda_input_mux *imux, | 3698 | const struct hda_input_mux *imux, |
3386 | struct snd_ctl_elem_value *ucontrol, | 3699 | struct snd_ctl_elem_value *ucontrol, |
@@ -3440,7 +3753,10 @@ static void cleanup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid) | |||
3440 | } | 3753 | } |
3441 | } | 3754 | } |
3442 | 3755 | ||
3443 | /* call each reboot notifier */ | 3756 | /** |
3757 | * snd_hda_bus_reboot_notify - call the reboot notifier of each codec | ||
3758 | * @bus: HD-audio bus | ||
3759 | */ | ||
3444 | void snd_hda_bus_reboot_notify(struct hda_bus *bus) | 3760 | void snd_hda_bus_reboot_notify(struct hda_bus *bus) |
3445 | { | 3761 | { |
3446 | struct hda_codec *codec; | 3762 | struct hda_codec *codec; |
@@ -3458,8 +3774,8 @@ void snd_hda_bus_reboot_notify(struct hda_bus *bus) | |||
3458 | } | 3774 | } |
3459 | EXPORT_SYMBOL_HDA(snd_hda_bus_reboot_notify); | 3775 | EXPORT_SYMBOL_HDA(snd_hda_bus_reboot_notify); |
3460 | 3776 | ||
3461 | /* | 3777 | /** |
3462 | * open the digital out in the exclusive mode | 3778 | * snd_hda_multi_out_dig_open - open the digital out in the exclusive mode |
3463 | */ | 3779 | */ |
3464 | int snd_hda_multi_out_dig_open(struct hda_codec *codec, | 3780 | int snd_hda_multi_out_dig_open(struct hda_codec *codec, |
3465 | struct hda_multi_out *mout) | 3781 | struct hda_multi_out *mout) |
@@ -3474,6 +3790,9 @@ int snd_hda_multi_out_dig_open(struct hda_codec *codec, | |||
3474 | } | 3790 | } |
3475 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_open); | 3791 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_open); |
3476 | 3792 | ||
3793 | /** | ||
3794 | * snd_hda_multi_out_dig_prepare - prepare the digital out stream | ||
3795 | */ | ||
3477 | int snd_hda_multi_out_dig_prepare(struct hda_codec *codec, | 3796 | int snd_hda_multi_out_dig_prepare(struct hda_codec *codec, |
3478 | struct hda_multi_out *mout, | 3797 | struct hda_multi_out *mout, |
3479 | unsigned int stream_tag, | 3798 | unsigned int stream_tag, |
@@ -3487,6 +3806,9 @@ int snd_hda_multi_out_dig_prepare(struct hda_codec *codec, | |||
3487 | } | 3806 | } |
3488 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_prepare); | 3807 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_prepare); |
3489 | 3808 | ||
3809 | /** | ||
3810 | * snd_hda_multi_out_dig_cleanup - clean-up the digital out stream | ||
3811 | */ | ||
3490 | int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec, | 3812 | int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec, |
3491 | struct hda_multi_out *mout) | 3813 | struct hda_multi_out *mout) |
3492 | { | 3814 | { |
@@ -3497,8 +3819,8 @@ int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec, | |||
3497 | } | 3819 | } |
3498 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_cleanup); | 3820 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_cleanup); |
3499 | 3821 | ||
3500 | /* | 3822 | /** |
3501 | * release the digital out | 3823 | * snd_hda_multi_out_dig_close - release the digital out stream |
3502 | */ | 3824 | */ |
3503 | int snd_hda_multi_out_dig_close(struct hda_codec *codec, | 3825 | int snd_hda_multi_out_dig_close(struct hda_codec *codec, |
3504 | struct hda_multi_out *mout) | 3826 | struct hda_multi_out *mout) |
@@ -3510,8 +3832,12 @@ int snd_hda_multi_out_dig_close(struct hda_codec *codec, | |||
3510 | } | 3832 | } |
3511 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_close); | 3833 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_close); |
3512 | 3834 | ||
3513 | /* | 3835 | /** |
3514 | * set up more restrictions for analog out | 3836 | * snd_hda_multi_out_analog_open - open analog outputs |
3837 | * | ||
3838 | * Open analog outputs and set up the hw-constraints. | ||
3839 | * If the digital outputs can be opened as slave, open the digital | ||
3840 | * outputs, too. | ||
3515 | */ | 3841 | */ |
3516 | int snd_hda_multi_out_analog_open(struct hda_codec *codec, | 3842 | int snd_hda_multi_out_analog_open(struct hda_codec *codec, |
3517 | struct hda_multi_out *mout, | 3843 | struct hda_multi_out *mout, |
@@ -3556,9 +3882,11 @@ int snd_hda_multi_out_analog_open(struct hda_codec *codec, | |||
3556 | } | 3882 | } |
3557 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_analog_open); | 3883 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_analog_open); |
3558 | 3884 | ||
3559 | /* | 3885 | /** |
3560 | * set up the i/o for analog out | 3886 | * snd_hda_multi_out_analog_prepare - Preapre the analog outputs. |
3561 | * when the digital out is available, copy the front out to digital out, too. | 3887 | * |
3888 | * Set up the i/o for analog out. | ||
3889 | * When the digital out is available, copy the front out to digital out, too. | ||
3562 | */ | 3890 | */ |
3563 | int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, | 3891 | int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, |
3564 | struct hda_multi_out *mout, | 3892 | struct hda_multi_out *mout, |
@@ -3615,8 +3943,8 @@ int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, | |||
3615 | } | 3943 | } |
3616 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_analog_prepare); | 3944 | EXPORT_SYMBOL_HDA(snd_hda_multi_out_analog_prepare); |
3617 | 3945 | ||
3618 | /* | 3946 | /** |
3619 | * clean up the setting for analog out | 3947 | * snd_hda_multi_out_analog_cleanup - clean up the setting for analog out |
3620 | */ | 3948 | */ |
3621 | int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec, | 3949 | int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec, |
3622 | struct hda_multi_out *mout) | 3950 | struct hda_multi_out *mout) |
@@ -4002,8 +4330,14 @@ EXPORT_SYMBOL_HDA(snd_hda_resume); | |||
4002 | * generic arrays | 4330 | * generic arrays |
4003 | */ | 4331 | */ |
4004 | 4332 | ||
4005 | /* get a new element from the given array | 4333 | /** |
4006 | * if it exceeds the pre-allocated array size, re-allocate the array | 4334 | * snd_array_new - get a new element from the given array |
4335 | * @array: the array object | ||
4336 | * | ||
4337 | * Get a new element from the given array. If it exceeds the | ||
4338 | * pre-allocated array size, re-allocate the array. | ||
4339 | * | ||
4340 | * Returns NULL if allocation failed. | ||
4007 | */ | 4341 | */ |
4008 | void *snd_array_new(struct snd_array *array) | 4342 | void *snd_array_new(struct snd_array *array) |
4009 | { | 4343 | { |
@@ -4027,7 +4361,10 @@ void *snd_array_new(struct snd_array *array) | |||
4027 | } | 4361 | } |
4028 | EXPORT_SYMBOL_HDA(snd_array_new); | 4362 | EXPORT_SYMBOL_HDA(snd_array_new); |
4029 | 4363 | ||
4030 | /* free the given array elements */ | 4364 | /** |
4365 | * snd_array_free - free the given array elements | ||
4366 | * @array: the array object | ||
4367 | */ | ||
4031 | void snd_array_free(struct snd_array *array) | 4368 | void snd_array_free(struct snd_array *array) |
4032 | { | 4369 | { |
4033 | kfree(array->list); | 4370 | kfree(array->list); |
@@ -4037,7 +4374,12 @@ void snd_array_free(struct snd_array *array) | |||
4037 | } | 4374 | } |
4038 | EXPORT_SYMBOL_HDA(snd_array_free); | 4375 | EXPORT_SYMBOL_HDA(snd_array_free); |
4039 | 4376 | ||
4040 | /* | 4377 | /** |
4378 | * snd_print_pcm_rates - Print the supported PCM rates to the string buffer | ||
4379 | * @pcm: PCM caps bits | ||
4380 | * @buf: the string buffer to write | ||
4381 | * @buflen: the max buffer length | ||
4382 | * | ||
4041 | * used by hda_proc.c and hda_eld.c | 4383 | * used by hda_proc.c and hda_eld.c |
4042 | */ | 4384 | */ |
4043 | void snd_print_pcm_rates(int pcm, char *buf, int buflen) | 4385 | void snd_print_pcm_rates(int pcm, char *buf, int buflen) |
@@ -4056,6 +4398,14 @@ void snd_print_pcm_rates(int pcm, char *buf, int buflen) | |||
4056 | } | 4398 | } |
4057 | EXPORT_SYMBOL_HDA(snd_print_pcm_rates); | 4399 | EXPORT_SYMBOL_HDA(snd_print_pcm_rates); |
4058 | 4400 | ||
4401 | /** | ||
4402 | * snd_print_pcm_bits - Print the supported PCM fmt bits to the string buffer | ||
4403 | * @pcm: PCM caps bits | ||
4404 | * @buf: the string buffer to write | ||
4405 | * @buflen: the max buffer length | ||
4406 | * | ||
4407 | * used by hda_proc.c and hda_eld.c | ||
4408 | */ | ||
4059 | void snd_print_pcm_bits(int pcm, char *buf, int buflen) | 4409 | void snd_print_pcm_bits(int pcm, char *buf, int buflen) |
4060 | { | 4410 | { |
4061 | static unsigned int bits[] = { 8, 16, 20, 24, 32 }; | 4411 | static unsigned int bits[] = { 8, 16, 20, 24, 32 }; |