Unverified Commit 0bb423f2 authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Mark Brown
Browse files

ASoC: regulator notifier registration should be managed



Regulator notifiers, that were registered during codec driver probing,
must be unregistered during driver release, or device managed versions
have to be used. This patch fixes codec drivers, that weren't explicitly
unregistering notifiers and simplifies those, that did that manually.

Signed-off-by: default avatarGuennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 51013553
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -615,7 +615,8 @@ static int max9860_probe(struct i2c_client *i2c)

	max9860->dvddio_nb.notifier_call = max9860_dvddio_event;

	ret = regulator_register_notifier(max9860->dvddio, &max9860->dvddio_nb);
	ret = devm_regulator_register_notifier(max9860->dvddio,
					       &max9860->dvddio_nb);
	if (ret)
		dev_err(dev, "Failed to register DVDDIO notifier: %d\n", ret);

+3 −2
Original line number Diff line number Diff line
@@ -1540,7 +1540,8 @@ int pcm512x_probe(struct device *dev, struct regmap *regmap)
	pcm512x->supply_nb[2].notifier_call = pcm512x_regulator_event_2;

	for (i = 0; i < ARRAY_SIZE(pcm512x->supplies); i++) {
		ret = regulator_register_notifier(pcm512x->supplies[i].consumer,
		ret = devm_regulator_register_notifier(
						pcm512x->supplies[i].consumer,
						&pcm512x->supply_nb[i]);
		if (ret != 0) {
			dev_err(dev,
+3 −13
Original line number Diff line number Diff line
@@ -1274,7 +1274,8 @@ static int aic31xx_codec_probe(struct snd_soc_component *component)
		aic31xx->disable_nb[i].nb.notifier_call =
			aic31xx_regulator_event;
		aic31xx->disable_nb[i].aic31xx = aic31xx;
		ret = regulator_register_notifier(aic31xx->supplies[i].consumer,
		ret = devm_regulator_register_notifier(
						aic31xx->supplies[i].consumer,
						&aic31xx->disable_nb[i].nb);
		if (ret) {
			dev_err(component->dev,
@@ -1298,19 +1299,8 @@ static int aic31xx_codec_probe(struct snd_soc_component *component)
	return 0;
}

static void aic31xx_codec_remove(struct snd_soc_component *component)
{
	struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component);
	int i;

	for (i = 0; i < ARRAY_SIZE(aic31xx->supplies); i++)
		regulator_unregister_notifier(aic31xx->supplies[i].consumer,
					      &aic31xx->disable_nb[i].nb);
}

static const struct snd_soc_component_driver soc_codec_driver_aic31xx = {
	.probe			= aic31xx_codec_probe,
	.remove			= aic31xx_codec_remove,
	.set_bias_level		= aic31xx_set_bias_level,
	.controls		= common31xx_snd_controls,
	.num_controls		= ARRAY_SIZE(common31xx_snd_controls),
+4 −21
Original line number Diff line number Diff line
@@ -1615,13 +1615,14 @@ static int aic3x_probe(struct snd_soc_component *component)
	for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++) {
		aic3x->disable_nb[i].nb.notifier_call = aic3x_regulator_event;
		aic3x->disable_nb[i].aic3x = aic3x;
		ret = regulator_register_notifier(aic3x->supplies[i].consumer,
		ret = devm_regulator_register_notifier(
						aic3x->supplies[i].consumer,
						&aic3x->disable_nb[i].nb);
		if (ret) {
			dev_err(component->dev,
				"Failed to request regulator notifier: %d\n",
				 ret);
			goto err_notif;
			return ret;
		}
	}

@@ -1679,29 +1680,11 @@ static int aic3x_probe(struct snd_soc_component *component)
	aic3x_add_widgets(component);

	return 0;

err_notif:
	while (i--)
		regulator_unregister_notifier(aic3x->supplies[i].consumer,
					      &aic3x->disable_nb[i].nb);
	return ret;
}

static void aic3x_remove(struct snd_soc_component *component)
{
	struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component);
	int i;

	list_del(&aic3x->list);
	for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++)
		regulator_unregister_notifier(aic3x->supplies[i].consumer,
					      &aic3x->disable_nb[i].nb);
}

static const struct snd_soc_component_driver soc_component_dev_aic3x = {
	.set_bias_level		= aic3x_set_bias_level,
	.probe			= aic3x_probe,
	.remove			= aic3x_remove,
	.controls		= aic3x_snd_controls,
	.num_controls		= ARRAY_SIZE(aic3x_snd_controls),
	.dapm_widgets		= aic3x_dapm_widgets,
+3 −15
Original line number Diff line number Diff line
@@ -666,7 +666,8 @@ static int wm8770_spi_probe(struct spi_device *spi)

	/* This should really be moved into the regulator core */
	for (i = 0; i < ARRAY_SIZE(wm8770->supplies); i++) {
		ret = regulator_register_notifier(wm8770->supplies[i].consumer,
		ret = devm_regulator_register_notifier(
						wm8770->supplies[i].consumer,
						&wm8770->disable_nb[i]);
		if (ret) {
			dev_err(&spi->dev,
@@ -687,25 +688,12 @@ static int wm8770_spi_probe(struct spi_device *spi)
	return ret;
}

static int wm8770_spi_remove(struct spi_device *spi)
{
	struct wm8770_priv *wm8770 = spi_get_drvdata(spi);
	int i;

	for (i = 0; i < ARRAY_SIZE(wm8770->supplies); ++i)
		regulator_unregister_notifier(wm8770->supplies[i].consumer,
					      &wm8770->disable_nb[i]);

	return 0;
}

static struct spi_driver wm8770_spi_driver = {
	.driver = {
		.name = "wm8770",
		.of_match_table = wm8770_of_match,
	},
	.probe = wm8770_spi_probe,
	.remove = wm8770_spi_remove
};

module_spi_driver(wm8770_spi_driver);
Loading