Commit 37aba319 authored by Shuming Fan's avatar Shuming Fan Committed by Mark Brown

ASoC: rt1308-sdw: fix random louder sound

This patch uses a vendor register to check whether the system hibernated ever.
The driver will only set the preset when the driver brings up or the system hibernated.
It will avoid the unknown issue that makes the speaker output louder and can't control the volume.

Signed-off-by: Shuming Fan <shumingf@realtek.com
Link: https://lore.kernel.org/r/20230811093822.37573-1-shumingf@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org
parent c1f848f1
...@@ -52,6 +52,7 @@ static bool rt1308_volatile_register(struct device *dev, unsigned int reg) ...@@ -52,6 +52,7 @@ static bool rt1308_volatile_register(struct device *dev, unsigned int reg)
case 0x300a: case 0x300a:
case 0xc000: case 0xc000:
case 0xc710: case 0xc710:
case 0xcf01:
case 0xc860 ... 0xc863: case 0xc860 ... 0xc863:
case 0xc870 ... 0xc873: case 0xc870 ... 0xc873:
return true; return true;
...@@ -213,7 +214,7 @@ static int rt1308_io_init(struct device *dev, struct sdw_slave *slave) ...@@ -213,7 +214,7 @@ static int rt1308_io_init(struct device *dev, struct sdw_slave *slave)
{ {
struct rt1308_sdw_priv *rt1308 = dev_get_drvdata(dev); struct rt1308_sdw_priv *rt1308 = dev_get_drvdata(dev);
int ret = 0; int ret = 0;
unsigned int tmp; unsigned int tmp, hibernation_flag;
if (rt1308->hw_init) if (rt1308->hw_init)
return 0; return 0;
...@@ -242,6 +243,10 @@ static int rt1308_io_init(struct device *dev, struct sdw_slave *slave) ...@@ -242,6 +243,10 @@ static int rt1308_io_init(struct device *dev, struct sdw_slave *slave)
pm_runtime_get_noresume(&slave->dev); pm_runtime_get_noresume(&slave->dev);
regmap_read(rt1308->regmap, 0xcf01, &hibernation_flag);
if ((hibernation_flag != 0x00) && rt1308->first_hw_init)
goto _preset_ready_;
/* sw reset */ /* sw reset */
regmap_write(rt1308->regmap, RT1308_SDW_RESET, 0); regmap_write(rt1308->regmap, RT1308_SDW_RESET, 0);
...@@ -282,6 +287,12 @@ static int rt1308_io_init(struct device *dev, struct sdw_slave *slave) ...@@ -282,6 +287,12 @@ static int rt1308_io_init(struct device *dev, struct sdw_slave *slave)
regmap_write(rt1308->regmap, 0xc100, 0xd7); regmap_write(rt1308->regmap, 0xc100, 0xd7);
regmap_write(rt1308->regmap, 0xc101, 0xd7); regmap_write(rt1308->regmap, 0xc101, 0xd7);
/* apply BQ params */
rt1308_apply_bq_params(rt1308);
regmap_write(rt1308->regmap, 0xcf01, 0x01);
_preset_ready_:
if (rt1308->first_hw_init) { if (rt1308->first_hw_init) {
regcache_cache_bypass(rt1308->regmap, false); regcache_cache_bypass(rt1308->regmap, false);
regcache_mark_dirty(rt1308->regmap); regcache_mark_dirty(rt1308->regmap);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment