Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 50c67877 authored by Janusz Krzysztofik's avatar Janusz Krzysztofik Committed by Mark Brown
Browse files

ASoC: cx20442: Don't ignore regulator_get() errors.



In its current shape, the driver just ignores errors returned by
regulator_get() at component_probe().  This doesn't hurt on Amstrad
Delta board as long as it registers the codec device at late_initcall,
when the regulator which depends on basic-mmio-gpio device (probed as
late as at dev_initcall) is already available.  Otherwise the driver
may end up trying to control a codec which is not powered up.

Remove that dependency on initialization order by handling the error.
If the regulator is not yet available and -ENODEV is returned, convert
it to -EPROBE_DEFER to get another chance.

Signed-off-by: default avatarJanusz Krzysztofik <jmkrzyszt@gmail.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent f4c277b8
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -362,8 +362,27 @@ static int cx20442_component_probe(struct snd_soc_component *component)
		return -ENOMEM;

	cx20442->por = regulator_get(component->dev, "POR");
	if (IS_ERR(cx20442->por))
		dev_warn(component->dev, "failed to get the regulator");
	if (IS_ERR(cx20442->por)) {
		int err = PTR_ERR(cx20442->por);

		dev_warn(component->dev, "failed to get POR supply (%d)", err);
		/*
		 * When running on a non-dt platform and requested regulator
		 * is not available, regulator_get() never returns
		 * -EPROBE_DEFER as it is not able to justify if the regulator
		 * may still appear later.  On the other hand, the board can
		 * still set full constraints flag at late_initcall in order
		 * to instruct regulator_get() to return a dummy one if
		 * sufficient.  Hence, if we get -ENODEV here, let's convert
		 * it to -EPROBE_DEFER and wait for the board to decide or
		 * let Deferred Probe infrastructure handle this error.
		 */
		if (err == -ENODEV)
			err = -EPROBE_DEFER;
		kfree(cx20442);
		return err;
	}

	cx20442->tty = NULL;

	snd_soc_component_set_drvdata(component, cx20442);