power: supply: wm8350-power: Handle error for wm8350_register_irq
authorJiasheng Jiang <jiasheng@iscas.ac.cn>
Fri, 4 Mar 2022 01:57:51 +0000 (09:57 +0800)
committerSebastian Reichel <sre@kernel.org>
Fri, 4 Mar 2022 21:20:32 +0000 (22:20 +0100)
As the potential failure of the wm8350_register_irq(),
it should be better to check it and return error if fails.
Also, use 'free_' in order to avoid same code.

Fixes: 14431aa0c5a4 ("power_supply: Add support for WM8350 PMU")
Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn>
Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/wm8350_power.c

index e05cee4..9c46c48 100644 (file)
@@ -408,44 +408,112 @@ static const struct power_supply_desc wm8350_usb_desc = {
  *             Initialisation
  *********************************************************************/
 
-static void wm8350_init_charger(struct wm8350 *wm8350)
+static int wm8350_init_charger(struct wm8350 *wm8350)
 {
+       int ret;
+
        /* register our interest in charger events */
-       wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT,
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT,
                            wm8350_charger_handler, 0, "Battery hot", wm8350);
-       wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD,
+       if (ret)
+               goto err;
+
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD,
                            wm8350_charger_handler, 0, "Battery cold", wm8350);
-       wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL,
+       if (ret)
+               goto free_chg_bat_hot;
+
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL,
                            wm8350_charger_handler, 0, "Battery fail", wm8350);
-       wm8350_register_irq(wm8350, WM8350_IRQ_CHG_TO,
+       if (ret)
+               goto free_chg_bat_cold;
+
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_TO,
                            wm8350_charger_handler, 0,
                            "Charger timeout", wm8350);
-       wm8350_register_irq(wm8350, WM8350_IRQ_CHG_END,
+       if (ret)
+               goto free_chg_bat_fail;
+
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_END,
                            wm8350_charger_handler, 0,
                            "Charge end", wm8350);
-       wm8350_register_irq(wm8350, WM8350_IRQ_CHG_START,
+       if (ret)
+               goto free_chg_to;
+
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_START,
                            wm8350_charger_handler, 0,
                            "Charge start", wm8350);
-       wm8350_register_irq(wm8350, WM8350_IRQ_CHG_FAST_RDY,
+       if (ret)
+               goto free_chg_end;
+
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_FAST_RDY,
                            wm8350_charger_handler, 0,
                            "Fast charge ready", wm8350);
-       wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9,
+       if (ret)
+               goto free_chg_start;
+
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9,
                            wm8350_charger_handler, 0,
                            "Battery <3.9V", wm8350);
-       wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1,
+       if (ret)
+               goto free_chg_fast_rdy;
+
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1,
                            wm8350_charger_handler, 0,
                            "Battery <3.1V", wm8350);
-       wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85,
+       if (ret)
+               goto free_chg_vbatt_lt_3p9;
+
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85,
                            wm8350_charger_handler, 0,
                            "Battery <2.85V", wm8350);
+       if (ret)
+               goto free_chg_vbatt_lt_3p1;
 
        /* and supply change events */
-       wm8350_register_irq(wm8350, WM8350_IRQ_EXT_USB_FB,
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_EXT_USB_FB,
                            wm8350_charger_handler, 0, "USB", wm8350);
-       wm8350_register_irq(wm8350, WM8350_IRQ_EXT_WALL_FB,
+       if (ret)
+               goto free_chg_vbatt_lt_2p85;
+
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_EXT_WALL_FB,
                            wm8350_charger_handler, 0, "Wall", wm8350);
-       wm8350_register_irq(wm8350, WM8350_IRQ_EXT_BAT_FB,
+       if (ret)
+               goto free_ext_usb_fb;
+
+       ret = wm8350_register_irq(wm8350, WM8350_IRQ_EXT_BAT_FB,
                            wm8350_charger_handler, 0, "Battery", wm8350);
+       if (ret)
+               goto free_ext_wall_fb;
+
+       return 0;
+
+free_ext_wall_fb:
+       wm8350_free_irq(wm8350, WM8350_IRQ_EXT_WALL_FB, wm8350);
+free_ext_usb_fb:
+       wm8350_free_irq(wm8350, WM8350_IRQ_EXT_USB_FB, wm8350);
+free_chg_vbatt_lt_2p85:
+       wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85, wm8350);
+free_chg_vbatt_lt_3p1:
+       wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1, wm8350);
+free_chg_vbatt_lt_3p9:
+       wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9, wm8350);
+free_chg_fast_rdy:
+       wm8350_free_irq(wm8350, WM8350_IRQ_CHG_FAST_RDY, wm8350);
+free_chg_start:
+       wm8350_free_irq(wm8350, WM8350_IRQ_CHG_START, wm8350);
+free_chg_end:
+       wm8350_free_irq(wm8350, WM8350_IRQ_CHG_END, wm8350);
+free_chg_to:
+       wm8350_free_irq(wm8350, WM8350_IRQ_CHG_TO, wm8350);
+free_chg_bat_fail:
+       wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL, wm8350);
+free_chg_bat_cold:
+       wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD, wm8350);
+free_chg_bat_hot:
+       wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT, wm8350);
+err:
+       return ret;
 }
 
 static void free_charger_irq(struct wm8350 *wm8350)