power: supply: wm8350-power: Handle error for wm8350_register_irq

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: 14431aa0c5 ("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>
This commit is contained in:
Jiasheng Jiang 2022-03-04 09:57:51 +08:00 committed by Sebastian Reichel
parent c8aee3f41c
commit b0b14b5ba1

View 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)