Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a16d8f41 authored by Jiasheng Jiang's avatar Jiasheng Jiang Committed by Greg Kroah-Hartman
Browse files

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



[ Upstream commit b0b14b5ba11bec56fad344a4a0b2e16449cc8b94 ]

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: 14431aa0 ("power_supply: Add support for WM8350 PMU")
Signed-off-by: default avatarJiasheng Jiang <jiasheng@iscas.ac.cn>
Acked-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent c7032923
Loading
Loading
Loading
Loading
+82 −14
Original line number Diff line number Diff line
@@ -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)