lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 072/667] ASoC: rsnd: care return value from rsnd_node_fixed_index()
    Date
    From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

    [ Upstream commit d09a7db431c65aaa8303eb456439d1831ca2e6b4 ]

    Renesas Sound is very complex, and thus it needs to use
    rsnd_node_fixed_index() to know enabled pin index.

    It returns error if strange pin was selected,
    but some codes didn't check it.

    This patch 1) indicates error message, 2) check return
    value.

    Reported-by: kernel test robot <lkp@intel.com>
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Link: https://lore.kernel.org/r/87pmlbgn5t.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/core.c | 15 ++++++++++-----
    sound/soc/sh/rcar/dma.c | 9 ++++++++-
    sound/soc/sh/rcar/rsnd.h | 2 +-
    sound/soc/sh/rcar/src.c | 7 ++++++-
    sound/soc/sh/rcar/ssi.c | 14 ++++++++++++--
    sound/soc/sh/rcar/ssiu.c | 7 ++++++-
    6 files changed, 43 insertions(+), 11 deletions(-)

    diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
    index 6a8fe0da7670..af8ef2a27d34 100644
    --- a/sound/soc/sh/rcar/core.c
    +++ b/sound/soc/sh/rcar/core.c
    @@ -1159,6 +1159,7 @@ void rsnd_parse_connect_common(struct rsnd_dai *rdai, char *name,
    struct device_node *capture)
    {
    struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
    + struct device *dev = rsnd_priv_to_dev(priv);
    struct device_node *np;
    int i;

    @@ -1169,7 +1170,11 @@ void rsnd_parse_connect_common(struct rsnd_dai *rdai, char *name,
    for_each_child_of_node(node, np) {
    struct rsnd_mod *mod;

    - i = rsnd_node_fixed_index(np, name, i);
    + i = rsnd_node_fixed_index(dev, np, name, i);
    + if (i < 0) {
    + of_node_put(np);
    + break;
    + }

    mod = mod_get(priv, i);

    @@ -1183,7 +1188,7 @@ void rsnd_parse_connect_common(struct rsnd_dai *rdai, char *name,
    of_node_put(node);
    }

    -int rsnd_node_fixed_index(struct device_node *node, char *name, int idx)
    +int rsnd_node_fixed_index(struct device *dev, struct device_node *node, char *name, int idx)
    {
    char node_name[16];

    @@ -1210,6 +1215,8 @@ int rsnd_node_fixed_index(struct device_node *node, char *name, int idx)
    return idx;
    }

    + dev_err(dev, "strange node numbering (%s)",
    + of_node_full_name(node));
    return -EINVAL;
    }

    @@ -1221,10 +1228,8 @@ int rsnd_node_count(struct rsnd_priv *priv, struct device_node *node, char *name

    i = 0;
    for_each_child_of_node(node, np) {
    - i = rsnd_node_fixed_index(np, name, i);
    + i = rsnd_node_fixed_index(dev, np, name, i);
    if (i < 0) {
    - dev_err(dev, "strange node numbering (%s)",
    - of_node_full_name(node));
    of_node_put(np);
    return 0;
    }
    diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c
    index 03e0d4eca781..463ab237d7bd 100644
    --- a/sound/soc/sh/rcar/dma.c
    +++ b/sound/soc/sh/rcar/dma.c
    @@ -240,12 +240,19 @@ static int rsnd_dmaen_start(struct rsnd_mod *mod,
    struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, char *name,
    struct rsnd_mod *mod, char *x)
    {
    + struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
    + struct device *dev = rsnd_priv_to_dev(priv);
    struct dma_chan *chan = NULL;
    struct device_node *np;
    int i = 0;

    for_each_child_of_node(of_node, np) {
    - i = rsnd_node_fixed_index(np, name, i);
    + i = rsnd_node_fixed_index(dev, np, name, i);
    + if (i < 0) {
    + chan = NULL;
    + of_node_put(np);
    + break;
    + }

    if (i == rsnd_mod_id_raw(mod) && (!chan))
    chan = of_dma_request_slave_channel(np, x);
    diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
    index 6580bab0e229..d9cd190d7e19 100644
    --- a/sound/soc/sh/rcar/rsnd.h
    +++ b/sound/soc/sh/rcar/rsnd.h
    @@ -460,7 +460,7 @@ void rsnd_parse_connect_common(struct rsnd_dai *rdai, char *name,
    struct device_node *playback,
    struct device_node *capture);
    int rsnd_node_count(struct rsnd_priv *priv, struct device_node *node, char *name);
    -int rsnd_node_fixed_index(struct device_node *node, char *name, int idx);
    +int rsnd_node_fixed_index(struct device *dev, struct device_node *node, char *name, int idx);

    int rsnd_channel_normalization(int chan);
    #define rsnd_runtime_channel_original(io) \
    diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
    index 42a100c6303d..0ea84ae57c6a 100644
    --- a/sound/soc/sh/rcar/src.c
    +++ b/sound/soc/sh/rcar/src.c
    @@ -676,7 +676,12 @@ int rsnd_src_probe(struct rsnd_priv *priv)
    if (!of_device_is_available(np))
    goto skip;

    - i = rsnd_node_fixed_index(np, SRC_NAME, i);
    + i = rsnd_node_fixed_index(dev, np, SRC_NAME, i);
    + if (i < 0) {
    + ret = -EINVAL;
    + of_node_put(np);
    + goto rsnd_src_probe_done;
    + }

    src = rsnd_src_get(priv, i);

    diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
    index 87e606f688d3..43c5e27dc5c8 100644
    --- a/sound/soc/sh/rcar/ssi.c
    +++ b/sound/soc/sh/rcar/ssi.c
    @@ -1105,6 +1105,7 @@ void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
    struct device_node *capture)
    {
    struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
    + struct device *dev = rsnd_priv_to_dev(priv);
    struct device_node *node;
    struct device_node *np;
    int i;
    @@ -1117,7 +1118,11 @@ void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
    for_each_child_of_node(node, np) {
    struct rsnd_mod *mod;

    - i = rsnd_node_fixed_index(np, SSI_NAME, i);
    + i = rsnd_node_fixed_index(dev, np, SSI_NAME, i);
    + if (i < 0) {
    + of_node_put(np);
    + break;
    + }

    mod = rsnd_ssi_mod_get(priv, i);

    @@ -1182,7 +1187,12 @@ int rsnd_ssi_probe(struct rsnd_priv *priv)
    if (!of_device_is_available(np))
    goto skip;

    - i = rsnd_node_fixed_index(np, SSI_NAME, i);
    + i = rsnd_node_fixed_index(dev, np, SSI_NAME, i);
    + if (i < 0) {
    + ret = -EINVAL;
    + of_node_put(np);
    + goto rsnd_ssi_probe_done;
    + }

    ssi = rsnd_ssi_get(priv, i);

    diff --git a/sound/soc/sh/rcar/ssiu.c b/sound/soc/sh/rcar/ssiu.c
    index 138f95dd9f4a..4b8a63e336c7 100644
    --- a/sound/soc/sh/rcar/ssiu.c
    +++ b/sound/soc/sh/rcar/ssiu.c
    @@ -462,6 +462,7 @@ void rsnd_parse_connect_ssiu(struct rsnd_dai *rdai,
    struct device_node *capture)
    {
    struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
    + struct device *dev = rsnd_priv_to_dev(priv);
    struct device_node *node = rsnd_ssiu_of_node(priv);
    struct rsnd_dai_stream *io_p = &rdai->playback;
    struct rsnd_dai_stream *io_c = &rdai->capture;
    @@ -474,7 +475,11 @@ void rsnd_parse_connect_ssiu(struct rsnd_dai *rdai,
    for_each_child_of_node(node, np) {
    struct rsnd_mod *mod;

    - i = rsnd_node_fixed_index(np, SSIU_NAME, i);
    + i = rsnd_node_fixed_index(dev, np, SSIU_NAME, i);
    + if (i < 0) {
    + of_node_put(np);
    + break;
    + }

    mod = rsnd_ssiu_mod_get(priv, i);

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-07 20:24    [W:4.139 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site