]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: codecs: wsa883x: Handle reading version failure
authorKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Wed, 10 Jul 2024 13:52:31 +0000 (15:52 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Oct 2024 10:00:24 +0000 (12:00 +0200)
[ Upstream commit 2fbf16992e5aa14acf0441320033a01a32309ded ]

If reading version and variant from registers fails (which is unlikely
but possible, because it is a read over bus), the driver will proceed
and perform device configuration based on uninitialized stack variables.
Handle it a bit better - bail out without doing any init and failing the
update status Soundwire callback.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Link: https://patch.msgid.link/20240710-asoc-wsa88xx-version-v1-2-f1c54966ccde@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/codecs/wsa883x.c

index 2169d939898419a5142e2a3c771176c6229066b8..1831d4487ba9d1a0d3c1434285fe1a148491353e 100644 (file)
@@ -998,15 +998,19 @@ static const struct reg_sequence reg_init[] = {
        {WSA883X_GMAMP_SUP1, 0xE2},
 };
 
-static void wsa883x_init(struct wsa883x_priv *wsa883x)
+static int wsa883x_init(struct wsa883x_priv *wsa883x)
 {
        struct regmap *regmap = wsa883x->regmap;
-       int variant, version;
+       int variant, version, ret;
 
-       regmap_read(regmap, WSA883X_OTP_REG_0, &variant);
+       ret = regmap_read(regmap, WSA883X_OTP_REG_0, &variant);
+       if (ret)
+               return ret;
        wsa883x->variant = variant & WSA883X_ID_MASK;
 
-       regmap_read(regmap, WSA883X_CHIP_ID0, &version);
+       ret = regmap_read(regmap, WSA883X_CHIP_ID0, &version);
+       if (ret)
+               return ret;
        wsa883x->version = version;
 
        switch (wsa883x->variant) {
@@ -1041,6 +1045,8 @@ static void wsa883x_init(struct wsa883x_priv *wsa883x)
                                   WSA883X_DRE_OFFSET_MASK,
                                   wsa883x->comp_offset);
        }
+
+       return 0;
 }
 
 static int wsa883x_update_status(struct sdw_slave *slave,
@@ -1049,7 +1055,7 @@ static int wsa883x_update_status(struct sdw_slave *slave,
        struct wsa883x_priv *wsa883x = dev_get_drvdata(&slave->dev);
 
        if (status == SDW_SLAVE_ATTACHED && slave->dev_num > 0)
-               wsa883x_init(wsa883x);
+               return wsa883x_init(wsa883x);
 
        return 0;
 }