lkml.org 
[lkml]   [2013]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[ 02/69] ALSA: hda - hdmi: Fix channel map switch not taking effect
    Date
    3.10-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Anssi Hannula <anssi.hannula@iki.fi>

    commit 39edac70e9aedf451fccaa851b273ace9fcca0bd upstream.

    Currently hdmi_setup_audio_infoframe() reprograms the HDA channel
    mapping only when the infoframe is not up-to-date or the non-PCM flag
    has changed.

    However, when just the channel map has been changed, the infoframe may
    still be up-to-date and non-PCM flag may not have changed, so the new
    channel map is not actually programmed into the HDA codec.

    Notably, this failing case is also always triggered when the device is
    already in a prepared state and a new channel map is configured while
    changing only the channel positions (for example, plain
    "speaker-test -c2 -m FR,FL").

    Fix that by always programming the channel map in
    hdmi_setup_audio_infoframe(). Tested on Intel HDMI.

    Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    sound/pci/hda/patch_hdmi.c | 18 ++++++++----------
    1 file changed, 8 insertions(+), 10 deletions(-)

    --- a/sound/pci/hda/patch_hdmi.c
    +++ b/sound/pci/hda/patch_hdmi.c
    @@ -930,6 +930,14 @@ static void hdmi_setup_audio_infoframe(s
    }

    /*
    + * always configure channel mapping, it may have been changed by the
    + * user in the meantime
    + */
    + hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca,
    + channels, per_pin->chmap,
    + per_pin->chmap_set);
    +
    + /*
    * sizeof(ai) is used instead of sizeof(*hdmi_ai) or
    * sizeof(*dp_ai) to avoid partial match/update problems when
    * the user switches between HDMI/DP monitors.
    @@ -940,20 +948,10 @@ static void hdmi_setup_audio_infoframe(s
    "pin=%d channels=%d\n",
    pin_nid,
    channels);
    - hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca,
    - channels, per_pin->chmap,
    - per_pin->chmap_set);
    hdmi_stop_infoframe_trans(codec, pin_nid);
    hdmi_fill_audio_infoframe(codec, pin_nid,
    ai.bytes, sizeof(ai));
    hdmi_start_infoframe_trans(codec, pin_nid);
    - } else {
    - /* For non-pcm audio switch, setup new channel mapping
    - * accordingly */
    - if (per_pin->non_pcm != non_pcm)
    - hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca,
    - channels, per_pin->chmap,
    - per_pin->chmap_set);
    }

    per_pin->non_pcm = non_pcm;



    \
     
     \ /
      Last update: 2013-10-16 20:01    [W:4.825 / U:0.372 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site