lkml.org 
[lkml]   [2020]   [Oct]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 03/14] ASoC: sun4i-i2s: Change get_sr() and get_wss() to be more explicit
    Date
    We are actually using a complex formula to just return a bunch of
    simple values. Also this formula is wrong for sun4i when calling
    get_wss() the function return 4 instead of 3.

    Replace this with a simpler switch case.

    Also drop the i2s params which is unused and return a simple int as
    returning an error code could be out of range for an s8 and there is
    no optim to return a s8 here.

    Fixes: 619c15f7fac9 ("ASoC: sun4i-i2s: Change SR and WSS computation")
    Reviewed-by: Chen-Yu Tsai <wens@csie.org>
    Signed-off-by: Clément Péron <peron.clem@gmail.com>
    ---
    sound/soc/sunxi/sun4i-i2s.c | 69 +++++++++++++++++++++++--------------
    1 file changed, 44 insertions(+), 25 deletions(-)

    diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
    index 1f577dbc20a6..f1fdb9a0ba54 100644
    --- a/sound/soc/sunxi/sun4i-i2s.c
    +++ b/sound/soc/sunxi/sun4i-i2s.c
    @@ -175,8 +175,8 @@ struct sun4i_i2s_quirks {
    unsigned int num_mclk_dividers;

    unsigned long (*get_bclk_parent_rate)(const struct sun4i_i2s *);
    - s8 (*get_sr)(const struct sun4i_i2s *, int);
    - s8 (*get_wss)(const struct sun4i_i2s *, int);
    + int (*get_sr)(unsigned int width);
    + int (*get_wss)(unsigned int width);
    int (*set_chan_cfg)(const struct sun4i_i2s *i2s,
    unsigned int channels, unsigned int slots,
    unsigned int slot_width);
    @@ -381,37 +381,56 @@ static int sun4i_i2s_set_clk_rate(struct snd_soc_dai *dai,
    return 0;
    }

    -static s8 sun4i_i2s_get_sr(const struct sun4i_i2s *i2s, int width)
    +static int sun4i_i2s_get_sr(unsigned int width)
    {
    - if (width < 16 || width > 24)
    - return -EINVAL;
    -
    - if (width % 4)
    - return -EINVAL;
    + switch (width) {
    + case 16:
    + return 0;
    + case 20:
    + return 1;
    + case 24:
    + return 2;
    + }

    - return (width - 16) / 4;
    + return -EINVAL;
    }

    -static s8 sun4i_i2s_get_wss(const struct sun4i_i2s *i2s, int width)
    +static int sun4i_i2s_get_wss(unsigned int width)
    {
    - if (width < 16 || width > 32)
    - return -EINVAL;
    -
    - if (width % 4)
    - return -EINVAL;
    + switch (width) {
    + case 16:
    + return 0;
    + case 20:
    + return 1;
    + case 24:
    + return 2;
    + case 32:
    + return 3;
    + }

    - return (width - 16) / 4;
    + return -EINVAL;
    }

    -static s8 sun8i_i2s_get_sr_wss(const struct sun4i_i2s *i2s, int width)
    +static int sun8i_i2s_get_sr_wss(unsigned int width)
    {
    - if (width % 4)
    - return -EINVAL;
    -
    - if (width < 8 || width > 32)
    - return -EINVAL;
    + switch (width) {
    + case 8:
    + return 1;
    + case 12:
    + return 2;
    + case 16:
    + return 3;
    + case 20:
    + return 4;
    + case 24:
    + return 5;
    + case 28:
    + return 6;
    + case 32:
    + return 7;
    + }

    - return (width - 8) / 4 + 1;
    + return -EINVAL;
    }

    static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
    @@ -574,11 +593,11 @@ static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream,
    }
    i2s->playback_dma_data.addr_width = width;

    - sr = i2s->variant->get_sr(i2s, word_size);
    + sr = i2s->variant->get_sr(word_size);
    if (sr < 0)
    return -EINVAL;

    - wss = i2s->variant->get_wss(i2s, slot_width);
    + wss = i2s->variant->get_wss(slot_width);
    if (wss < 0)
    return -EINVAL;

    --
    2.25.1
    \
     
     \ /
      Last update: 2020-10-11 22:23    [W:7.343 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site