Skip to content

Commit 92ccbf1

Browse files
ZheyuMabroonie
authored andcommitted
ASoC: wm8731: Disable the regulator when probing fails
When the driver fails during probing, the driver should disable the regulator, not just handle it in wm8731_hw_init(). The following log reveals it: [ 17.812483] WARNING: CPU: 1 PID: 364 at drivers/regulator/core.c:2257 _regulator_put+0x3ec/0x4e0 [ 17.815958] RIP: 0010:_regulator_put+0x3ec/0x4e0 [ 17.824467] Call Trace: [ 17.824774] <TASK> [ 17.825040] regulator_bulk_free+0x82/0xe0 [ 17.825514] devres_release_group+0x319/0x3d0 [ 17.825882] i2c_device_probe+0x766/0x940 [ 17.829198] i2c_register_driver+0xb5/0x130 Signed-off-by: Zheyu Ma <zheyuma97@gmail.com> Link: https://lore.kernel.org/r/20220405121038.4094051-1-zheyuma97@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 97326be commit 92ccbf1

1 file changed

Lines changed: 11 additions & 8 deletions

File tree

sound/soc/codecs/wm8731.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ static int wm8731_hw_init(struct device *dev, struct wm8731_priv *wm8731)
602602
ret = wm8731_reset(wm8731->regmap);
603603
if (ret < 0) {
604604
dev_err(dev, "Failed to issue reset: %d\n", ret);
605-
goto err_regulator_enable;
605+
goto err;
606606
}
607607

608608
/* Clear POWEROFF, keep everything else disabled */
@@ -619,10 +619,7 @@ static int wm8731_hw_init(struct device *dev, struct wm8731_priv *wm8731)
619619

620620
regcache_mark_dirty(wm8731->regmap);
621621

622-
err_regulator_enable:
623-
/* Regulators will be enabled by bias management */
624-
regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
625-
622+
err:
626623
return ret;
627624
}
628625

@@ -760,21 +757,27 @@ static int wm8731_i2c_probe(struct i2c_client *i2c,
760757
ret = PTR_ERR(wm8731->regmap);
761758
dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
762759
ret);
763-
return ret;
760+
goto err_regulator_enable;
764761
}
765762

766763
ret = wm8731_hw_init(&i2c->dev, wm8731);
767764
if (ret != 0)
768-
return ret;
765+
goto err_regulator_enable;
769766

770767
ret = devm_snd_soc_register_component(&i2c->dev,
771768
&soc_component_dev_wm8731, &wm8731_dai, 1);
772769
if (ret != 0) {
773770
dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret);
774-
return ret;
771+
goto err_regulator_enable;
775772
}
776773

777774
return 0;
775+
776+
err_regulator_enable:
777+
/* Regulators will be enabled by bias management */
778+
regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
779+
780+
return ret;
778781
}
779782

780783
static const struct i2c_device_id wm8731_i2c_id[] = {

0 commit comments

Comments
 (0)