diff mbox series

[1/2] ASoC: codecs: ES8326: Reducing power consumption

Message ID 20240320075409.3539-2-zhangyi@everest-semi.com
State New
Headers show
Series ASoC: codecs: ES8326: Reducin powerconsumption and | expand

Commit Message

Zhang Yi March 20, 2024, 7:54 a.m. UTC
For lower power consumption during hibernation, the configuration of
es8326_suspend and es8326_remove will be adjusted.
Adding es8326_i2c_shutdown and es8326_i2c_remove to cover different
situations

Signed-off-by: Zhang Yi <zhangyi@everest-semi.com>
---
 sound/soc/codecs/es8326.c | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

Comments

Amadeusz Sławiński March 20, 2024, 7:56 a.m. UTC | #1
On 3/20/2024 8:54 AM, Zhang Yi wrote:
> For lower power consumption during hibernation, the configuration of
> es8326_suspend and es8326_remove will be adjusted.
> Adding es8326_i2c_shutdown and es8326_i2c_remove to cover different
> situations
> 
> Signed-off-by: Zhang Yi <zhangyi@everest-semi.com>
> ---
>   sound/soc/codecs/es8326.c | 34 +++++++++++++++++++++++++++++++++-
>   1 file changed, 33 insertions(+), 1 deletion(-)
> 
> diff --git a/sound/soc/codecs/es8326.c b/sound/soc/codecs/es8326.c
> index 15289dadafea..5c89323035a2 100755
> --- a/sound/soc/codecs/es8326.c
> +++ b/sound/soc/codecs/es8326.c
> @@ -1072,12 +1072,13 @@ static int es8326_suspend(struct snd_soc_component *component)
>   	es8326->calibrated = false;
>   	regmap_write(es8326->regmap, ES8326_CLK_CTL, ES8326_CLK_OFF);
>   	regcache_cache_only(es8326->regmap, true);
> -	regcache_mark_dirty(es8326->regmap);
>   
>   	/* reset register value to default */
>   	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x01);
>   	usleep_range(1000, 3000);
>   	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x00);
> +	
> +	regcache_mark_dirty(es8326->regmap);
>   	return 0;
>   }
>   
> @@ -1163,8 +1164,13 @@ static int es8326_set_jack(struct snd_soc_component *component,
>   
>   static void es8326_remove(struct snd_soc_component *component)
>   {
> +	struct es8326_priv *es8326 = snd_soc_component_get_drvdata(component);
> +
>   	es8326_disable_jack_detect(component);
>   	es8326_set_bias_level(component, SND_SOC_BIAS_OFF);
> +	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x01);
> +	usleep_range(1000, 3000);
> +	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x00);
>   }
>   
>   static const struct snd_soc_component_driver soc_component_dev_es8326 = {
> @@ -1236,6 +1242,30 @@ static int es8326_i2c_probe(struct i2c_client *i2c)
>   					&es8326_dai, 1);
>   }
>   
> +
> +static void es8326_i2c_shutdown(struct i2c_client *i2c)
> +{
> +	struct snd_soc_component *component;
> +	struct es8326_priv *es8326;
> +
> +	dev_dbg(component->dev, "Enter into %s\n", __func__);

Above line works on unset pointer, you need to set component before 
dereferencing it.

> +	es8326 = i2c_get_clientdata(i2c);
> +	component = es8326->component;
> +	cancel_delayed_work_sync(&es8326->jack_detect_work);
> +	cancel_delayed_work_sync(&es8326->button_press_work);
> +
> +	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x01);
> +	usleep_range(1000, 3000);
> +	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x00);
> +
> +	return;
> +}
> +
> +static void es8326_i2c_remove(struct i2c_client *i2c)
> +{
> +	es8326_i2c_shutdown(i2c);
> +}
> +
>   static const struct i2c_device_id es8326_i2c_id[] = {
>   	{"es8326", 0 },
>   	{}
> @@ -1265,6 +1295,8 @@ static struct i2c_driver es8326_i2c_driver = {
>   		.of_match_table = of_match_ptr(es8326_of_match),
>   	},
>   	.probe = es8326_i2c_probe,
> +	.shutdown = es8326_i2c_shutdown,
> +	.remove = es8326_i2c_remove,
>   	.id_table = es8326_i2c_id,
>   };
>   module_i2c_driver(es8326_i2c_driver);
diff mbox series

Patch

diff --git a/sound/soc/codecs/es8326.c b/sound/soc/codecs/es8326.c
index 15289dadafea..5c89323035a2 100755
--- a/sound/soc/codecs/es8326.c
+++ b/sound/soc/codecs/es8326.c
@@ -1072,12 +1072,13 @@  static int es8326_suspend(struct snd_soc_component *component)
 	es8326->calibrated = false;
 	regmap_write(es8326->regmap, ES8326_CLK_CTL, ES8326_CLK_OFF);
 	regcache_cache_only(es8326->regmap, true);
-	regcache_mark_dirty(es8326->regmap);
 
 	/* reset register value to default */
 	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x01);
 	usleep_range(1000, 3000);
 	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x00);
+	
+	regcache_mark_dirty(es8326->regmap);
 	return 0;
 }
 
@@ -1163,8 +1164,13 @@  static int es8326_set_jack(struct snd_soc_component *component,
 
 static void es8326_remove(struct snd_soc_component *component)
 {
+	struct es8326_priv *es8326 = snd_soc_component_get_drvdata(component);
+
 	es8326_disable_jack_detect(component);
 	es8326_set_bias_level(component, SND_SOC_BIAS_OFF);
+	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x01);
+	usleep_range(1000, 3000);
+	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x00);
 }
 
 static const struct snd_soc_component_driver soc_component_dev_es8326 = {
@@ -1236,6 +1242,30 @@  static int es8326_i2c_probe(struct i2c_client *i2c)
 					&es8326_dai, 1);
 }
 
+
+static void es8326_i2c_shutdown(struct i2c_client *i2c)
+{
+	struct snd_soc_component *component;
+	struct es8326_priv *es8326;
+
+	dev_dbg(component->dev, "Enter into %s\n", __func__);
+	es8326 = i2c_get_clientdata(i2c);
+	component = es8326->component;
+	cancel_delayed_work_sync(&es8326->jack_detect_work);
+	cancel_delayed_work_sync(&es8326->button_press_work);
+    
+	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x01);
+	usleep_range(1000, 3000);
+	regmap_write(es8326->regmap, ES8326_CSM_I2C_STA, 0x00);
+
+	return;
+}
+
+static void es8326_i2c_remove(struct i2c_client *i2c)
+{
+	es8326_i2c_shutdown(i2c);
+}
+
 static const struct i2c_device_id es8326_i2c_id[] = {
 	{"es8326", 0 },
 	{}
@@ -1265,6 +1295,8 @@  static struct i2c_driver es8326_i2c_driver = {
 		.of_match_table = of_match_ptr(es8326_of_match),
 	},
 	.probe = es8326_i2c_probe,
+	.shutdown = es8326_i2c_shutdown,
+	.remove = es8326_i2c_remove,
 	.id_table = es8326_i2c_id,
 };
 module_i2c_driver(es8326_i2c_driver);