lkml.org 
[lkml]   [2020]   [May]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 50/80] ASoC: dapm: fixup dapm kcontrol widget
    Date
    From: Gyeongtaek Lee <gt82.lee@samsung.com>

    commit ebf1474745b4373fdde0fcf32d9d1f369b50b212 upstream.

    snd_soc_dapm_kcontrol widget which is created by autodisable control
    should contain correct on_val, mask and shift because it is set when the
    widget is powered and changed value is applied on registers by following
    code in dapm_seq_run_coalesced().

    mask |= w->mask << w->shift;
    if (w->power)
    value |= w->on_val << w->shift;
    else
    value |= w->off_val << w->shift;

    Shift on the mask in dapm_kcontrol_data_alloc() is removed to prevent
    double shift.
    And, on_val in dapm_kcontrol_set_value() is modified to get correct
    value in the dapm_seq_run_coalesced().

    Signed-off-by: Gyeongtaek Lee <gt82.lee@samsung.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/000001d61537$b212f620$1638e260$@samsung.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    sound/soc/soc-dapm.c | 20 +++++++++++++++++---
    1 file changed, 17 insertions(+), 3 deletions(-)

    --- a/sound/soc/soc-dapm.c
    +++ b/sound/soc/soc-dapm.c
    @@ -384,7 +384,7 @@ static int dapm_kcontrol_data_alloc(stru

    memset(&template, 0, sizeof(template));
    template.reg = e->reg;
    - template.mask = e->mask << e->shift_l;
    + template.mask = e->mask;
    template.shift = e->shift_l;
    template.off_val = snd_soc_enum_item_to_val(e, 0);
    template.on_val = template.off_val;
    @@ -510,8 +510,22 @@ static bool dapm_kcontrol_set_value(cons
    if (data->value == value)
    return false;

    - if (data->widget)
    - data->widget->on_val = value;
    + if (data->widget) {
    + switch (dapm_kcontrol_get_wlist(kcontrol)->widgets[0]->id) {
    + case snd_soc_dapm_switch:
    + case snd_soc_dapm_mixer:
    + case snd_soc_dapm_mixer_named_ctl:
    + data->widget->on_val = value & data->widget->mask;
    + break;
    + case snd_soc_dapm_demux:
    + case snd_soc_dapm_mux:
    + data->widget->on_val = value >> data->widget->shift;
    + break;
    + default:
    + data->widget->on_val = value;
    + break;
    + }
    + }

    data->value = value;


    \
     
     \ /
      Last update: 2020-05-01 15:59    [W:4.326 / U:0.588 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site