extcon: arizona: Correct error handling on regmap_update_bits_check
authorCharles Keepax <ckeepax@opensource.cirrus.com>
Wed, 29 May 2019 09:46:05 +0000 (10:46 +0100)
committerChanwoo Choi <cw00.choi@samsung.com>
Thu, 30 May 2019 01:02:17 +0000 (10:02 +0900)
Ensure the case when regmap_update_bits_check fails and the change
variable is not updated is handled correctly.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
drivers/extcon/extcon-arizona.c

index 9327479c719c23b3653eb0572a1750ed5b06ee4a..519e89aedd4a0e5df0230651335ea5041268a937 100644 (file)
@@ -335,10 +335,12 @@ static void arizona_start_mic(struct arizona_extcon_info *info)
 
        arizona_extcon_pulse_micbias(info);
 
-       regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
-                                ARIZONA_MICD_ENA, ARIZONA_MICD_ENA,
-                                &change);
-       if (!change) {
+       ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
+                                      ARIZONA_MICD_ENA, ARIZONA_MICD_ENA,
+                                      &change);
+       if (ret < 0) {
+               dev_err(arizona->dev, "Failed to enable micd: %d\n", ret);
+       } else if (!change) {
                regulator_disable(info->micvdd);
                pm_runtime_put_autosuspend(info->dev);
        }
@@ -350,12 +352,14 @@ static void arizona_stop_mic(struct arizona_extcon_info *info)
        const char *widget = arizona_extcon_get_micbias(info);
        struct snd_soc_dapm_context *dapm = arizona->dapm;
        struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
-       bool change;
+       bool change = false;
        int ret;
 
-       regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
-                                ARIZONA_MICD_ENA, 0,
-                                &change);
+       ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
+                                      ARIZONA_MICD_ENA, 0,
+                                      &change);
+       if (ret < 0)
+               dev_err(arizona->dev, "Failed to disable micd: %d\n", ret);
 
        ret = snd_soc_component_disable_pin(component, widget);
        if (ret != 0)
@@ -1727,12 +1731,15 @@ static int arizona_extcon_remove(struct platform_device *pdev)
        struct arizona *arizona = info->arizona;
        int jack_irq_rise, jack_irq_fall;
        bool change;
+       int ret;
 
-       regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
-                                ARIZONA_MICD_ENA, 0,
-                                &change);
-
-       if (change) {
+       ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
+                                      ARIZONA_MICD_ENA, 0,
+                                      &change);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "Failed to disable micd on remove: %d\n",
+                       ret);
+       } else if (change) {
                regulator_disable(info->micvdd);
                pm_runtime_put(info->dev);
        }