lkml.org 
[lkml]   [2021]   [May]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.11 072/329] ASoC: rsnd: call rsnd_ssi_master_clk_start() from rsnd_ssi_init()
    Date
    From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

    [ Upstream commit a122a116fc6d8fcf2f202dcd185173a54268f239 ]

    Current rsnd needs to call .prepare (P) for clock settings,
    .trigger for playback start (S) and stop (E).
    It should be called as below from SSI point of view.

    P -> S -> E -> P -> S -> E -> ...

    But, if you used MIXer, below case might happen

    (2)
    1: P -> S ---> E -> ...
    2: P ----> S -> ...
    (1) (3)

    P(1) setups clock, but E(2) resets it. and starts playback (3).
    In such case, it will reports "SSI parent/child should use same rate".

    rsnd_ssi_master_clk_start() which is the main function at (P)
    was called from rsnd_ssi_init() (= S) before,
    but was moved by below patch to rsnd_soc_dai_prepare() (= P) to avoid
    using clk_get_rate() which shouldn't be used under atomic context.

    commit 4d230d1271064 ("ASoC: rsnd: fixup not to call clk_get/set
    under non-atomic")

    Because of above patch, rsnd_ssi_master_clk_start() is now called at (P)
    which is for non atomic context. But (P) is assuming that spin lock is
    *not* used.
    One issue now is rsnd_ssi_master_clk_start() is checking ssi->xxx
    which should be protected by spin lock.

    After above patch, adg.c had below patch for other reasons.

    commit 06e8f5c842f2d ("ASoC: rsnd: don't call clk_get_rate()
    under atomic context")

    clk_get_rate() is used at probe() timing by this patch.
    In other words, rsnd_ssi_master_clk_start() is no longer using
    clk_get_rate() any more.

    This means we can call it from rsnd_ssi_init() (= S) again which is
    protected by spin lock.
    This patch re-move it to under spin lock, and solves
    1. checking ssi->xxx without spin lock issue.
    2. clk setting / device start / device stop race condition.

    Reported-by: Linh Phung T. Y. <linh.phung.jy@renesas.com>
    Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Link: https://lore.kernel.org/r/875z0x1jt5.wl-kuninori.morimoto.gx@renesas.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/sh/rcar/ssi.c | 14 +++++---------
    1 file changed, 5 insertions(+), 9 deletions(-)

    diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
    index d0ded427a836..a2f8138d40c7 100644
    --- a/sound/soc/sh/rcar/ssi.c
    +++ b/sound/soc/sh/rcar/ssi.c
    @@ -507,10 +507,15 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
    struct rsnd_priv *priv)
    {
    struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
    + int ret;

    if (!rsnd_ssi_is_run_mods(mod, io))
    return 0;

    + ret = rsnd_ssi_master_clk_start(mod, io);
    + if (ret < 0)
    + return ret;
    +
    ssi->usrcnt++;

    rsnd_mod_power_on(mod);
    @@ -1060,13 +1065,6 @@ static int rsnd_ssi_pio_pointer(struct rsnd_mod *mod,
    return 0;
    }

    -static int rsnd_ssi_prepare(struct rsnd_mod *mod,
    - struct rsnd_dai_stream *io,
    - struct rsnd_priv *priv)
    -{
    - return rsnd_ssi_master_clk_start(mod, io);
    -}
    -
    static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
    .name = SSI_NAME,
    .probe = rsnd_ssi_common_probe,
    @@ -1079,7 +1077,6 @@ static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
    .pointer = rsnd_ssi_pio_pointer,
    .pcm_new = rsnd_ssi_pcm_new,
    .hw_params = rsnd_ssi_hw_params,
    - .prepare = rsnd_ssi_prepare,
    .get_status = rsnd_ssi_get_status,
    };

    @@ -1166,7 +1163,6 @@ static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
    .pcm_new = rsnd_ssi_pcm_new,
    .fallback = rsnd_ssi_fallback,
    .hw_params = rsnd_ssi_hw_params,
    - .prepare = rsnd_ssi_prepare,
    .get_status = rsnd_ssi_get_status,
    };

    --
    2.30.2


    \
     
     \ /
      Last update: 2021-05-17 16:46    [W:3.106 / U:0.316 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site