lkml.org 
[lkml]   [2021]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.11 011/152] ASoC: sgtl5000: set DAP_AVC_CTRL register to correct default value on probe
    Date
    From: Benjamin Rood <benjaminjrood@gmail.com>

    [ Upstream commit f86f58e3594fb0ab1993d833d3b9a2496f3c928c ]

    According to the SGTL5000 datasheet [1], the DAP_AVC_CTRL register has
    the following bit field definitions:

    | BITS | FIELD | RW | RESET | DEFINITION |
    | 15 | RSVD | RO | 0x0 | Reserved |
    | 14 | RSVD | RW | 0x1 | Reserved |
    | 13:12 | MAX_GAIN | RW | 0x1 | Max Gain of AVC in expander mode |
    | 11:10 | RSVD | RO | 0x0 | Reserved |
    | 9:8 | LBI_RESP | RW | 0x1 | Integrator Response |
    | 7:6 | RSVD | RO | 0x0 | Reserved |
    | 5 | HARD_LMT_EN | RW | 0x0 | Enable hard limiter mode |
    | 4:1 | RSVD | RO | 0x0 | Reserved |
    | 0 | EN | RW | 0x0 | Enable/Disable AVC |

    The original default value written to the DAP_AVC_CTRL register during
    sgtl5000_i2c_probe() was 0x0510. This would incorrectly write values to
    bits 4 and 10, which are defined as RESERVED. It would also not set
    bits 12 and 14 to their correct RESET values of 0x1, and instead set
    them to 0x0. While the DAP_AVC module is effectively disabled because
    the EN bit is 0, this default value is still writing invalid values to
    registers that are marked as read-only and RESERVED as well as not
    setting bits 12 and 14 to their correct default values as defined by the
    datasheet.

    The correct value that should be written to the DAP_AVC_CTRL register is
    0x5100, which configures the register bits to the default values defined
    by the datasheet, and prevents any writes to bits defined as
    'read-only'. Generally speaking, it is best practice to NOT attempt to
    write values to registers/bits defined as RESERVED, as it generally
    produces unwanted/undefined behavior, or errors.

    Also, all credit for this patch should go to my colleague Dan MacDonald
    <dmacdonald@curbellmedical.com> for finding this error in the first
    place.

    [1] https://www.nxp.com/docs/en/data-sheet/SGTL5000.pdf

    Signed-off-by: Benjamin Rood <benjaminjrood@gmail.com>
    Reviewed-by: Fabio Estevam <festevam@gmail.com>
    Link: https://lore.kernel.org/r/20210219183308.GA2117@ubuntu-dev
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/codecs/sgtl5000.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c
    index 4d6ff8114622..4c0e87e22b97 100644
    --- a/sound/soc/codecs/sgtl5000.c
    +++ b/sound/soc/codecs/sgtl5000.c
    @@ -71,7 +71,7 @@ static const struct reg_default sgtl5000_reg_defaults[] = {
    { SGTL5000_DAP_EQ_BASS_BAND4, 0x002f },
    { SGTL5000_DAP_MAIN_CHAN, 0x8000 },
    { SGTL5000_DAP_MIX_CHAN, 0x0000 },
    - { SGTL5000_DAP_AVC_CTRL, 0x0510 },
    + { SGTL5000_DAP_AVC_CTRL, 0x5100 },
    { SGTL5000_DAP_AVC_THRESHOLD, 0x1473 },
    { SGTL5000_DAP_AVC_ATTACK, 0x0028 },
    { SGTL5000_DAP_AVC_DECAY, 0x0050 },
    --
    2.30.1


    \
     
     \ /
      Last update: 2021-04-05 11:41    [W:4.607 / U:0.428 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site