OSDN Git Service

ASoC: rsnd: care return value from rsnd_node_fixed_index()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 21 Apr 2022 02:55:58 +0000 (02:55 +0000)
committerMark Brown <broonie@kernel.org>
Thu, 21 Apr 2022 14:53:15 +0000 (15:53 +0100)
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>
sound/soc/sh/rcar/core.c
sound/soc/sh/rcar/dma.c
sound/soc/sh/rcar/rsnd.h
sound/soc/sh/rcar/src.c
sound/soc/sh/rcar/ssi.c
sound/soc/sh/rcar/ssiu.c

index 0c435bf..eb762ab 100644 (file)
@@ -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;
                }
index 03e0d4e..463ab23 100644 (file)
@@ -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);
index 6580bab..d9cd190 100644 (file)
@@ -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) \
index 42a100c..0ea84ae 100644 (file)
@@ -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);
 
index 87e606f..43c5e27 100644 (file)
@@ -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);
 
index 138f95d..4b8a63e 100644 (file)
@@ -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);