lkml.org 
[lkml]   [2022]   [Aug]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 184/365] ASoC: codec: tlv320aic32x4: fix mono playback via I2S
    Date
    From: Philipp Zabel <p.zabel@pengutronix.de>

    commit b4b5f29a076e52181f63e45a2ad1bc88593072e3 upstream.

    The two commits referenced below break mono playback via I2S DAI because
    they set BCLK to half the required speed. For PCM transport over I2S, the
    number of transmitted channels is always 2, even for mono playback.

    Fixes: dcd79364bff3 ("ASoC: codec: tlv3204: Enable 24 bit audio support")
    Fixes: 40b37136287b ("ASoC: tlv320aic32x4: Fix bdiv clock rate derivation")
    Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
    Link: https://lore.kernel.org/r/20220810104156.665452-1-p.zabel@pengutronix.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    sound/soc/codecs/tlv320aic32x4.c | 9 +++++++++
    1 file changed, 9 insertions(+)

    --- a/sound/soc/codecs/tlv320aic32x4.c
    +++ b/sound/soc/codecs/tlv320aic32x4.c
    @@ -49,6 +49,8 @@ struct aic32x4_priv {
    struct aic32x4_setup_data *setup;
    struct device *dev;
    enum aic32x4_type type;
    +
    + unsigned int fmt;
    };

    static int aic32x4_reset_adc(struct snd_soc_dapm_widget *w,
    @@ -611,6 +613,7 @@ static int aic32x4_set_dai_sysclk(struct
    static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
    {
    struct snd_soc_component *component = codec_dai->component;
    + struct aic32x4_priv *aic32x4 = snd_soc_component_get_drvdata(component);
    u8 iface_reg_1 = 0;
    u8 iface_reg_2 = 0;
    u8 iface_reg_3 = 0;
    @@ -654,6 +657,8 @@ static int aic32x4_set_dai_fmt(struct sn
    return -EINVAL;
    }

    + aic32x4->fmt = fmt;
    +
    snd_soc_component_update_bits(component, AIC32X4_IFACE1,
    AIC32X4_IFACE1_DATATYPE_MASK |
    AIC32X4_IFACE1_MASTER_MASK, iface_reg_1);
    @@ -758,6 +763,10 @@ static int aic32x4_setup_clocks(struct s
    return -EINVAL;
    }

    + /* PCM over I2S is always 2-channel */
    + if ((aic32x4->fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S)
    + channels = 2;
    +
    madc = DIV_ROUND_UP((32 * adc_resource_class), aosr);
    max_dosr = (AIC32X4_MAX_DOSR_FREQ / sample_rate / dosr_increment) *
    dosr_increment;

    \
     
     \ /
      Last update: 2022-08-23 11:14    [W:2.136 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site