lkml.org 
[lkml]   [2019]   [Aug]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 07/21] ASoC: sun4i-i2s: Don't use the oversample to calculate BCLK
    Date
    From: Maxime Ripard <maxime.ripard@bootlin.com>

    The BCLK divider should be calculated using the parameters that actually
    make the BCLK rate: the number of channels, the sampling rate and the
    sample width.

    We've been using the oversample_rate previously because in the former SoCs,
    the BCLK's parent is MCLK, which in turn is being used to generate the
    oversample rate, so we end up with something like this:

    oversample = mclk_rate / sampling_rate
    bclk_div = oversample / word_size / channels

    So, bclk_div = mclk_rate / sampling_rate / word_size / channels.

    And this is actually better, since the oversampling ratio only plays a role
    because the MCLK is its parent, not because of what BCLK is supposed to be.

    Furthermore, that assumption of MCLK being the parent has been broken on
    newer SoCs, so let's use the proper formula, and have the parent rate as an
    argument.

    Fixes: 7d2993811a1e ("ASoC: sun4i-i2s: Add support for H3")
    Fixes: 21faaea1343f ("ASoC: sun4i-i2s: Add support for A83T")
    Fixes: 66ecce332538 ("ASoC: sun4i-i2s: Add compatibility with A64 codec I2S")
    Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
    ---
    sound/soc/sunxi/sun4i-i2s.c | 9 +++++----
    1 file changed, 5 insertions(+), 4 deletions(-)

    diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
    index 3d7f4a97e0ba..ee8ee3eb2087 100644
    --- a/sound/soc/sunxi/sun4i-i2s.c
    +++ b/sound/soc/sunxi/sun4i-i2s.c
    @@ -208,10 +208,11 @@ static const struct sun4i_i2s_clk_div sun4i_i2s_mclk_div[] = {
    };

    static int sun4i_i2s_get_bclk_div(struct sun4i_i2s *i2s,
    - unsigned int oversample_rate,
    + unsigned long parent_rate,
    + unsigned int sampling_rate,
    unsigned int word_size)
    {
    - int div = oversample_rate / word_size / 2;
    + int div = parent_rate / sampling_rate / word_size / 2;
    int i;

    for (i = 0; i < ARRAY_SIZE(sun4i_i2s_bclk_div); i++) {
    @@ -300,8 +301,8 @@ static int sun4i_i2s_set_clk_rate(struct snd_soc_dai *dai,
    return -EINVAL;
    }

    - bclk_div = sun4i_i2s_get_bclk_div(i2s, oversample_rate,
    - word_size);
    + bclk_div = sun4i_i2s_get_bclk_div(i2s, i2s->mclk_freq,
    + rate, word_size);
    if (bclk_div < 0) {
    dev_err(dai->dev, "Unsupported BCLK divider: %d\n", bclk_div);
    return -EINVAL;
    --
    git-series 0.9.1
    \
     
     \ /
      Last update: 2019-08-19 21:26    [W:6.706 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site