diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-03-22 15:45:08 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-03-22 15:45:08 -0400 |
| commit | 70dc52faae971cb7cfd6b0d3a5824886bb5045bb (patch) | |
| tree | ecaf02bb9ecb29de4ee5e527bd6b2123794f979a | |
| parent | 1e0695cbc814c718763ed93f20711b12c46cfa40 (diff) | |
| parent | 55a63d4da3b8850480a1c5b222f77c739e30e346 (diff) | |
Merge tag 'sound-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai:
"Mostly HD-audio and USB-audio regression fixes:
- Oops fix at unloading of snd-hda-codec-conexant module
- A few trivial regression fixes for Cirrus and Conexant HD-audio
codecs
- Relax the USB-audio descriptor parse errors as non-fatal
- Fix locking of HD-audio CA0132 DSP loader
- Fix the generic HD-audio parser for VIA codecs"
* tag 'sound-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: hda - Fix DAC assignment for independent HP
ALSA: hda - Fix abuse of snd_hda_lock_devices() for DSP loader
ALSA: hda - Fix typo in checking IEC958 emphasis bit
ALSA: snd-usb: mixer: ignore -EINVAL in snd_usb_mixer_controls()
ALSA: snd-usb: mixer: propagate errors up the call chain
ALSA: usb: Parse UAC2 extension unit like for UAC1
ALSA: hda - Fix yet missing GPIO/EAPD setup in cirrus driver
ALSA: hda/cirrus - Fix the digital beep registration
ALSA: hda - Fix missing beep detach in patch_conexant.c
ALSA: documentation: Fix typo in Documentation/sound
| -rw-r--r-- | Documentation/sound/alsa/ALSA-Configuration.txt | 2 | ||||
| -rw-r--r-- | Documentation/sound/alsa/seq_oss.html | 2 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/hda_generic.c | 46 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 132 | ||||
| -rw-r--r-- | sound/pci/hda/patch_cirrus.c | 4 | ||||
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 16 | ||||
| -rw-r--r-- | sound/usb/mixer.c | 21 |
8 files changed, 184 insertions, 41 deletions
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index ce6581c8ca26..4499bd948860 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
| @@ -912,7 +912,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
| 912 | models depending on the codec chip. The list of available models | 912 | models depending on the codec chip. The list of available models |
| 913 | is found in HD-Audio-Models.txt | 913 | is found in HD-Audio-Models.txt |
| 914 | 914 | ||
| 915 | The model name "genric" is treated as a special case. When this | 915 | The model name "generic" is treated as a special case. When this |
| 916 | model is given, the driver uses the generic codec parser without | 916 | model is given, the driver uses the generic codec parser without |
| 917 | "codec-patch". It's sometimes good for testing and debugging. | 917 | "codec-patch". It's sometimes good for testing and debugging. |
| 918 | 918 | ||
diff --git a/Documentation/sound/alsa/seq_oss.html b/Documentation/sound/alsa/seq_oss.html index d9776cf60c07..9663b45f6fde 100644 --- a/Documentation/sound/alsa/seq_oss.html +++ b/Documentation/sound/alsa/seq_oss.html | |||
| @@ -285,7 +285,7 @@ sample data. | |||
| 285 | <H4> | 285 | <H4> |
| 286 | 7.2.4 Close Callback</H4> | 286 | 7.2.4 Close Callback</H4> |
| 287 | The <TT>close</TT> callback is called when this device is closed by the | 287 | The <TT>close</TT> callback is called when this device is closed by the |
| 288 | applicaion. If any private data was allocated in open callback, it must | 288 | application. If any private data was allocated in open callback, it must |
| 289 | be released in the close callback. The deletion of ALSA port should be | 289 | be released in the close callback. The deletion of ALSA port should be |
| 290 | done here, too. This callback must not be NULL. | 290 | done here, too. This callback must not be NULL. |
| 291 | <H4> | 291 | <H4> |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index a9ebcf9e3710..ecdf30eb5879 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -3144,7 +3144,7 @@ static unsigned int convert_to_spdif_status(unsigned short val) | |||
| 3144 | if (val & AC_DIG1_PROFESSIONAL) | 3144 | if (val & AC_DIG1_PROFESSIONAL) |
| 3145 | sbits |= IEC958_AES0_PROFESSIONAL; | 3145 | sbits |= IEC958_AES0_PROFESSIONAL; |
| 3146 | if (sbits & IEC958_AES0_PROFESSIONAL) { | 3146 | if (sbits & IEC958_AES0_PROFESSIONAL) { |
| 3147 | if (sbits & AC_DIG1_EMPHASIS) | 3147 | if (val & AC_DIG1_EMPHASIS) |
| 3148 | sbits |= IEC958_AES0_PRO_EMPHASIS_5015; | 3148 | sbits |= IEC958_AES0_PRO_EMPHASIS_5015; |
| 3149 | } else { | 3149 | } else { |
| 3150 | if (val & AC_DIG1_EMPHASIS) | 3150 | if (val & AC_DIG1_EMPHASIS) |
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 78897d05d80f..43c2ea539561 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
| @@ -995,6 +995,8 @@ enum { | |||
| 995 | BAD_NO_EXTRA_SURR_DAC = 0x101, | 995 | BAD_NO_EXTRA_SURR_DAC = 0x101, |
| 996 | /* Primary DAC shared with main surrounds */ | 996 | /* Primary DAC shared with main surrounds */ |
| 997 | BAD_SHARED_SURROUND = 0x100, | 997 | BAD_SHARED_SURROUND = 0x100, |
| 998 | /* No independent HP possible */ | ||
| 999 | BAD_NO_INDEP_HP = 0x40, | ||
| 998 | /* Primary DAC shared with main CLFE */ | 1000 | /* Primary DAC shared with main CLFE */ |
| 999 | BAD_SHARED_CLFE = 0x10, | 1001 | BAD_SHARED_CLFE = 0x10, |
| 1000 | /* Primary DAC shared with extra surrounds */ | 1002 | /* Primary DAC shared with extra surrounds */ |
| @@ -1392,6 +1394,43 @@ static int check_aamix_out_path(struct hda_codec *codec, int path_idx) | |||
| 1392 | return snd_hda_get_path_idx(codec, path); | 1394 | return snd_hda_get_path_idx(codec, path); |
| 1393 | } | 1395 | } |
| 1394 | 1396 | ||
| 1397 | /* check whether the independent HP is available with the current config */ | ||
| 1398 | static bool indep_hp_possible(struct hda_codec *codec) | ||
| 1399 | { | ||
| 1400 | struct hda_gen_spec *spec = codec->spec; | ||
| 1401 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
| 1402 | struct nid_path *path; | ||
| 1403 | int i, idx; | ||
| 1404 | |||
| 1405 | if (cfg->line_out_type == AUTO_PIN_HP_OUT) | ||
| 1406 | idx = spec->out_paths[0]; | ||
| 1407 | else | ||
| 1408 | idx = spec->hp_paths[0]; | ||
| 1409 | path = snd_hda_get_path_from_idx(codec, idx); | ||
| 1410 | if (!path) | ||
| 1411 | return false; | ||
| 1412 | |||
| 1413 | /* assume no path conflicts unless aamix is involved */ | ||
| 1414 | if (!spec->mixer_nid || !is_nid_contained(path, spec->mixer_nid)) | ||
| 1415 | return true; | ||
| 1416 | |||
| 1417 | /* check whether output paths contain aamix */ | ||
| 1418 | for (i = 0; i < cfg->line_outs; i++) { | ||
| 1419 | if (spec->out_paths[i] == idx) | ||
| 1420 | break; | ||
| 1421 | path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]); | ||
| 1422 | if (path && is_nid_contained(path, spec->mixer_nid)) | ||
| 1423 | return false; | ||
| 1424 | } | ||
| 1425 | for (i = 0; i < cfg->speaker_outs; i++) { | ||
| 1426 | path = snd_hda_get_path_from_idx(codec, spec->speaker_paths[i]); | ||
| 1427 | if (path && is_nid_contained(path, spec->mixer_nid)) | ||
| 1428 | return false; | ||
| 1429 | } | ||
| 1430 | |||
| 1431 | return true; | ||
| 1432 | } | ||
| 1433 | |||
| 1395 | /* fill the empty entries in the dac array for speaker/hp with the | 1434 | /* fill the empty entries in the dac array for speaker/hp with the |
| 1396 | * shared dac pointed by the paths | 1435 | * shared dac pointed by the paths |
| 1397 | */ | 1436 | */ |
| @@ -1545,6 +1584,9 @@ static int fill_and_eval_dacs(struct hda_codec *codec, | |||
| 1545 | badness += BAD_MULTI_IO; | 1584 | badness += BAD_MULTI_IO; |
| 1546 | } | 1585 | } |
| 1547 | 1586 | ||
| 1587 | if (spec->indep_hp && !indep_hp_possible(codec)) | ||
| 1588 | badness += BAD_NO_INDEP_HP; | ||
| 1589 | |||
| 1548 | /* re-fill the shared DAC for speaker / headphone */ | 1590 | /* re-fill the shared DAC for speaker / headphone */ |
| 1549 | if (cfg->line_out_type != AUTO_PIN_HP_OUT) | 1591 | if (cfg->line_out_type != AUTO_PIN_HP_OUT) |
| 1550 | refill_shared_dacs(codec, cfg->hp_outs, | 1592 | refill_shared_dacs(codec, cfg->hp_outs, |
| @@ -1758,6 +1800,10 @@ static int parse_output_paths(struct hda_codec *codec) | |||
| 1758 | cfg->speaker_pins, val); | 1800 | cfg->speaker_pins, val); |
| 1759 | } | 1801 | } |
| 1760 | 1802 | ||
| 1803 | /* clear indep_hp flag if not available */ | ||
| 1804 | if (spec->indep_hp && !indep_hp_possible(codec)) | ||
| 1805 | spec->indep_hp = 0; | ||
| 1806 | |||
| 1761 | kfree(best_cfg); | 1807 | kfree(best_cfg); |
| 1762 | return 0; | 1808 | return 0; |
| 1763 | } | 1809 | } |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 4cea6bb6fade..418bfc0eb0a3 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -415,6 +415,8 @@ struct azx_dev { | |||
| 415 | unsigned int opened :1; | 415 | unsigned int opened :1; |
| 416 | unsigned int running :1; | 416 | unsigned int running :1; |
| 417 | unsigned int irq_pending :1; | 417 | unsigned int irq_pending :1; |
| 418 | unsigned int prepared:1; | ||
| 419 | unsigned int locked:1; | ||
| 418 | /* | 420 | /* |
| 419 | * For VIA: | 421 | * For VIA: |
| 420 | * A flag to ensure DMA position is 0 | 422 | * A flag to ensure DMA position is 0 |
| @@ -426,8 +428,25 @@ struct azx_dev { | |||
| 426 | 428 | ||
| 427 | struct timecounter azx_tc; | 429 | struct timecounter azx_tc; |
| 428 | struct cyclecounter azx_cc; | 430 | struct cyclecounter azx_cc; |
| 431 | |||
| 432 | #ifdef CONFIG_SND_HDA_DSP_LOADER | ||
| 433 | struct mutex dsp_mutex; | ||
| 434 | #endif | ||
| 429 | }; | 435 | }; |
| 430 | 436 | ||
| 437 | /* DSP lock helpers */ | ||
| 438 | #ifdef CONFIG_SND_HDA_DSP_LOADER | ||
| 439 | #define dsp_lock_init(dev) mutex_init(&(dev)->dsp_mutex) | ||
| 440 | #define dsp_lock(dev) mutex_lock(&(dev)->dsp_mutex) | ||
| 441 | #define dsp_unlock(dev) mutex_unlock(&(dev)->dsp_mutex) | ||
| 442 | #define dsp_is_locked(dev) ((dev)->locked) | ||
| 443 | #else | ||
| 444 | #define dsp_lock_init(dev) do {} while (0) | ||
| 445 | #define dsp_lock(dev) do {} while (0) | ||
| 446 | #define dsp_unlock(dev) do {} while (0) | ||
| 447 | #define dsp_is_locked(dev) 0 | ||
| 448 | #endif | ||
| 449 | |||
| 431 | /* CORB/RIRB */ | 450 | /* CORB/RIRB */ |
| 432 | struct azx_rb { | 451 | struct azx_rb { |
| 433 | u32 *buf; /* CORB/RIRB buffer | 452 | u32 *buf; /* CORB/RIRB buffer |
| @@ -527,6 +546,10 @@ struct azx { | |||
| 527 | 546 | ||
| 528 | /* card list (for power_save trigger) */ | 547 | /* card list (for power_save trigger) */ |
| 529 | struct list_head list; | 548 | struct list_head list; |
| 549 | |||
| 550 | #ifdef CONFIG_SND_HDA_DSP_LOADER | ||
| 551 | struct azx_dev saved_azx_dev; | ||
| 552 | #endif | ||
| 530 | }; | 553 | }; |
| 531 | 554 | ||
| 532 | #define CREATE_TRACE_POINTS | 555 | #define CREATE_TRACE_POINTS |
| @@ -1793,15 +1816,25 @@ azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream) | |||
| 1793 | dev = chip->capture_index_offset; | 1816 | dev = chip->capture_index_offset; |
| 1794 | nums = chip->capture_streams; | 1817 | nums = chip->capture_streams; |
| 1795 | } | 1818 | } |
| 1796 | for (i = 0; i < nums; i++, dev++) | ||
