summaryrefslogtreecommitdiff
path: root/sound/soc/codecs/wsa883x.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/wsa883x.c')
-rw-r--r--sound/soc/codecs/wsa883x.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/sound/soc/codecs/wsa883x.c b/sound/soc/codecs/wsa883x.c
index c3046e260cb9..468d2b38a22a 100644
--- a/sound/soc/codecs/wsa883x.c
+++ b/sound/soc/codecs/wsa883x.c
@@ -475,6 +475,7 @@ struct wsa883x_priv {
int active_ports;
int dev_mode;
int comp_offset;
+ bool hw_init;
/*
* Protects temperature reading code (related to speaker protection) and
* fields: temperature and pa_on.
@@ -1043,6 +1044,9 @@ static int wsa883x_init(struct wsa883x_priv *wsa883x)
struct regmap *regmap = wsa883x->regmap;
int variant, version, ret;
+ if (wsa883x->hw_init)
+ return 0;
+
ret = regmap_read(regmap, WSA883X_OTP_REG_0, &variant);
if (ret)
return ret;
@@ -1054,22 +1058,23 @@ static int wsa883x_init(struct wsa883x_priv *wsa883x)
switch (variant) {
case WSA8830:
- dev_info(wsa883x->dev, "WSA883X Version 1_%d, Variant: WSA8830\n",
- version);
+ dev_dbg(wsa883x->dev, "WSA883X Version 1_%d, Variant: WSA8830\n",
+ version);
break;
case WSA8835:
- dev_info(wsa883x->dev, "WSA883X Version 1_%d, Variant: WSA8835\n",
- version);
+ dev_dbg(wsa883x->dev, "WSA883X Version 1_%d, Variant: WSA8835\n",
+ version);
break;
case WSA8832:
- dev_info(wsa883x->dev, "WSA883X Version 1_%d, Variant: WSA8832\n",
- version);
+ dev_dbg(wsa883x->dev, "WSA883X Version 1_%d, Variant: WSA8832\n",
+ version);
break;
case WSA8835_V2:
- dev_info(wsa883x->dev, "WSA883X Version 1_%d, Variant: WSA8835_V2\n",
- version);
+ dev_dbg(wsa883x->dev, "WSA883X Version 1_%d, Variant: WSA8835_V2\n",
+ version);
break;
default:
+ dev_warn(wsa883x->dev, "unknown variant: %d\n", variant);
break;
}
@@ -1085,6 +1090,8 @@ static int wsa883x_init(struct wsa883x_priv *wsa883x)
wsa883x->comp_offset);
}
+ wsa883x->hw_init = true;
+
return 0;
}
@@ -1093,6 +1100,9 @@ static int wsa883x_update_status(struct sdw_slave *slave,
{
struct wsa883x_priv *wsa883x = dev_get_drvdata(&slave->dev);
+ if (status == SDW_SLAVE_UNATTACHED)
+ wsa883x->hw_init = false;
+
if (status == SDW_SLAVE_ATTACHED && slave->dev_num > 0)
return wsa883x_init(wsa883x);