]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
ASoC: cs42l51: Improve error handling in cs42l51_remove()
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 10 Jan 2022 07:18:32 +0000 (08:18 +0100)
committerMark Brown <broonie@kernel.org>
Fri, 28 Jan 2022 16:00:22 +0000 (16:00 +0000)
When disabling a regulator fails while the device goes away, there is
little we can do and the machine is probably in enough trouble that any
action we'd want to take fails anyhow.

The return value used to be passed on in cs42l51_i2c_remove() (i.e. the
i2c device remove callback). But the i2c core ignores the error code
(apart from emitting a generic warning) and removes the device anyhow.

So return 0 unconditionally in cs42l51_i2c_remove(), and instead of
returning the error code to the upper layer emit a more helpful warning
message. After that nobody is interested any more in the actual error
code, so let cs42l51_remove() return void.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Link: https://lore.kernel.org/r/20220110071832.306185-1-u.kleine-koenig@pengutronix.de
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs42l51-i2c.c
sound/soc/codecs/cs42l51.c
sound/soc/codecs/cs42l51.h

index 70260e0a8f0959b04f37b72657679228ce5fd034..3cb21a2ba29f1289963add8e8f130b92333c72a4 100644 (file)
@@ -31,7 +31,9 @@ static int cs42l51_i2c_probe(struct i2c_client *i2c,
 
 static int cs42l51_i2c_remove(struct i2c_client *i2c)
 {
-       return cs42l51_remove(&i2c->dev);
+       cs42l51_remove(&i2c->dev);
+
+       return 0;
 }
 
 static const struct dev_pm_ops cs42l51_pm_ops = {
index c61b17dc2af876e2d4055f3a3f483317185271d9..e9c3cb4e2bfcb8cbe663118d272c84b35dcb733e 100644 (file)
@@ -793,14 +793,19 @@ error:
 }
 EXPORT_SYMBOL_GPL(cs42l51_probe);
 
-int cs42l51_remove(struct device *dev)
+void cs42l51_remove(struct device *dev)
 {
        struct cs42l51_private *cs42l51 = dev_get_drvdata(dev);
+       int ret;
 
        gpiod_set_value_cansleep(cs42l51->reset_gpio, 1);
 
-       return regulator_bulk_disable(ARRAY_SIZE(cs42l51->supplies),
-                                     cs42l51->supplies);
+       ret = regulator_bulk_disable(ARRAY_SIZE(cs42l51->supplies),
+                                    cs42l51->supplies);
+       if (ret)
+               dev_warn(dev, "Failed to disable all regulators (%pe)\n",
+                        ERR_PTR(ret));
+
 }
 EXPORT_SYMBOL_GPL(cs42l51_remove);
 
index 9d06cf7f88768257683e844fd967ba199ebad81c..a79343e8a54eaded7d22d598392687ad809d4698 100644 (file)
@@ -13,7 +13,7 @@ struct device;
 
 extern const struct regmap_config cs42l51_regmap;
 int cs42l51_probe(struct device *dev, struct regmap *regmap);
-int cs42l51_remove(struct device *dev);
+void cs42l51_remove(struct device *dev);
 int __maybe_unused cs42l51_suspend(struct device *dev);
 int __maybe_unused cs42l51_resume(struct device *dev);
 extern const struct of_device_id cs42l51_of_match[];