lkml.org 
[lkml]   [2022]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 034/112] ASoC: sgtl5000: Fix noise on shutdown/remove
    Date
    From: Francesco Dolcini <francesco.dolcini@toradex.com>

    [ Upstream commit 040e3360af3736348112d29425bf5d0be5b93115 ]

    Put the SGTL5000 in a silent/safe state on shutdown/remove, this is
    required since the SGTL5000 produces a constant noise on its output
    after it is configured and its clock is removed. Without this change
    this is happening every time the module is unbound/removed or from
    reboot till the clock is enabled again.

    The issue was experienced on both a Toradex Colibri/Apalis iMX6, but can
    be easily reproduced everywhere just playing something on the codec and
    after that removing/unbinding the driver.

    Fixes: 9b34e6cc3bc2 ("ASoC: Add Freescale SGTL5000 codec support")
    Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
    Reviewed-by: Fabio Estevam <festevam@denx.de>
    Link: https://lore.kernel.org/r/20220624101301.441314-1-francesco.dolcini@toradex.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/codecs/sgtl5000.c | 9 +++++++++
    sound/soc/codecs/sgtl5000.h | 1 +
    2 files changed, 10 insertions(+)

    diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c
    index 4c0e87e22b97..f066e016a874 100644
    --- a/sound/soc/codecs/sgtl5000.c
    +++ b/sound/soc/codecs/sgtl5000.c
    @@ -1797,6 +1797,9 @@ static int sgtl5000_i2c_remove(struct i2c_client *client)
    {
    struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client);

    + regmap_write(sgtl5000->regmap, SGTL5000_CHIP_DIG_POWER, SGTL5000_DIG_POWER_DEFAULT);
    + regmap_write(sgtl5000->regmap, SGTL5000_CHIP_ANA_POWER, SGTL5000_ANA_POWER_DEFAULT);
    +
    clk_disable_unprepare(sgtl5000->mclk);
    regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies);
    regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies);
    @@ -1804,6 +1807,11 @@ static int sgtl5000_i2c_remove(struct i2c_client *client)
    return 0;
    }

    +static void sgtl5000_i2c_shutdown(struct i2c_client *client)
    +{
    + sgtl5000_i2c_remove(client);
    +}
    +
    static const struct i2c_device_id sgtl5000_id[] = {
    {"sgtl5000", 0},
    {},
    @@ -1824,6 +1832,7 @@ static struct i2c_driver sgtl5000_i2c_driver = {
    },
    .probe = sgtl5000_i2c_probe,
    .remove = sgtl5000_i2c_remove,
    + .shutdown = sgtl5000_i2c_shutdown,
    .id_table = sgtl5000_id,
    };

    diff --git a/sound/soc/codecs/sgtl5000.h b/sound/soc/codecs/sgtl5000.h
    index 56ec5863f250..3a808c762299 100644
    --- a/sound/soc/codecs/sgtl5000.h
    +++ b/sound/soc/codecs/sgtl5000.h
    @@ -80,6 +80,7 @@
    /*
    * SGTL5000_CHIP_DIG_POWER
    */
    +#define SGTL5000_DIG_POWER_DEFAULT 0x0000
    #define SGTL5000_ADC_EN 0x0040
    #define SGTL5000_DAC_EN 0x0020
    #define SGTL5000_DAP_POWERUP 0x0010
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-07-19 14:19    [W:3.734 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site