diff options
author | Janusz Krzysztofik <jmkrzyszt@gmail.com> | 2018-06-24 21:14:41 +0300 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2018-06-25 14:45:15 +0300 |
commit | 50c678772a0b3f9dc6b04262f27e2c373fe03a4d (patch) | |
tree | 188000fadfb61d5469e8ffa46698e76cdb9a9a80 /sound | |
parent | f4c277b817cc9489fffabffb4e15d2f3b686056c (diff) | |
download | linux-50c678772a0b3f9dc6b04262f27e2c373fe03a4d.tar.xz |
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: Janusz Krzysztofik <jmkrzyszt@gmail.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/codecs/cx20442.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/sound/soc/codecs/cx20442.c b/sound/soc/codecs/cx20442.c index 07dd33b09596..ab174b5114dc 100644 --- a/sound/soc/codecs/cx20442.c +++ b/sound/soc/codecs/cx20442.c @@ -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); |