mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-18 23:29:57 +02:00
ASoC: codecs: wsa883x: Handle reading version failure
[ Upstream commit 2fbf16992e
]
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>
This commit is contained in:
parent
70d5e30b0a
commit
71faa656b8
|
@ -998,15 +998,19 @@ static const struct reg_sequence reg_init[] = {
|
||||||
{WSA883X_GMAMP_SUP1, 0xE2},
|
{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;
|
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;
|
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;
|
wsa883x->version = version;
|
||||||
|
|
||||||
switch (wsa883x->variant) {
|
switch (wsa883x->variant) {
|
||||||
|
@ -1041,6 +1045,8 @@ static void wsa883x_init(struct wsa883x_priv *wsa883x)
|
||||||
WSA883X_DRE_OFFSET_MASK,
|
WSA883X_DRE_OFFSET_MASK,
|
||||||
wsa883x->comp_offset);
|
wsa883x->comp_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wsa883x_update_status(struct sdw_slave *slave,
|
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);
|
struct wsa883x_priv *wsa883x = dev_get_drvdata(&slave->dev);
|
||||||
|
|
||||||
if (status == SDW_SLAVE_ATTACHED && slave->dev_num > 0)
|
if (status == SDW_SLAVE_ATTACHED && slave->dev_num > 0)
|
||||||
wsa883x_init(wsa883x);
|
return wsa883x_init(wsa883x);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user