> > 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@xxxxxxxxxxxxxxxx> > > --- > > 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); I'm sorry. I'll fix my mistake.