Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: 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>

authored by

Jiasheng Jiang and committed by
Sebastian Reichel
b0b14b5b c8aee3f4

+82 -14
+82 -14
drivers/power/supply/wm8350_power.c
··· 408 408 * Initialisation 409 409 *********************************************************************/ 410 410 411 - static void wm8350_init_charger(struct wm8350 *wm8350) 411 + static int wm8350_init_charger(struct wm8350 *wm8350) 412 412 { 413 + int ret; 414 + 413 415 /* register our interest in charger events */ 414 - wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT, 416 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT, 415 417 wm8350_charger_handler, 0, "Battery hot", wm8350); 416 - wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD, 418 + if (ret) 419 + goto err; 420 + 421 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD, 417 422 wm8350_charger_handler, 0, "Battery cold", wm8350); 418 - wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL, 423 + if (ret) 424 + goto free_chg_bat_hot; 425 + 426 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL, 419 427 wm8350_charger_handler, 0, "Battery fail", wm8350); 420 - wm8350_register_irq(wm8350, WM8350_IRQ_CHG_TO, 428 + if (ret) 429 + goto free_chg_bat_cold; 430 + 431 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_TO, 421 432 wm8350_charger_handler, 0, 422 433 "Charger timeout", wm8350); 423 - wm8350_register_irq(wm8350, WM8350_IRQ_CHG_END, 434 + if (ret) 435 + goto free_chg_bat_fail; 436 + 437 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_END, 424 438 wm8350_charger_handler, 0, 425 439 "Charge end", wm8350); 426 - wm8350_register_irq(wm8350, WM8350_IRQ_CHG_START, 440 + if (ret) 441 + goto free_chg_to; 442 + 443 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_START, 427 444 wm8350_charger_handler, 0, 428 445 "Charge start", wm8350); 429 - wm8350_register_irq(wm8350, WM8350_IRQ_CHG_FAST_RDY, 446 + if (ret) 447 + goto free_chg_end; 448 + 449 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_FAST_RDY, 430 450 wm8350_charger_handler, 0, 431 451 "Fast charge ready", wm8350); 432 - wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9, 452 + if (ret) 453 + goto free_chg_start; 454 + 455 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9, 433 456 wm8350_charger_handler, 0, 434 457 "Battery <3.9V", wm8350); 435 - wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1, 458 + if (ret) 459 + goto free_chg_fast_rdy; 460 + 461 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1, 436 462 wm8350_charger_handler, 0, 437 463 "Battery <3.1V", wm8350); 438 - wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85, 464 + if (ret) 465 + goto free_chg_vbatt_lt_3p9; 466 + 467 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85, 439 468 wm8350_charger_handler, 0, 440 469 "Battery <2.85V", wm8350); 470 + if (ret) 471 + goto free_chg_vbatt_lt_3p1; 441 472 442 473 /* and supply change events */ 443 - wm8350_register_irq(wm8350, WM8350_IRQ_EXT_USB_FB, 474 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_EXT_USB_FB, 444 475 wm8350_charger_handler, 0, "USB", wm8350); 445 - wm8350_register_irq(wm8350, WM8350_IRQ_EXT_WALL_FB, 476 + if (ret) 477 + goto free_chg_vbatt_lt_2p85; 478 + 479 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_EXT_WALL_FB, 446 480 wm8350_charger_handler, 0, "Wall", wm8350); 447 - wm8350_register_irq(wm8350, WM8350_IRQ_EXT_BAT_FB, 481 + if (ret) 482 + goto free_ext_usb_fb; 483 + 484 + ret = wm8350_register_irq(wm8350, WM8350_IRQ_EXT_BAT_FB, 448 485 wm8350_charger_handler, 0, "Battery", wm8350); 486 + if (ret) 487 + goto free_ext_wall_fb; 488 + 489 + return 0; 490 + 491 + free_ext_wall_fb: 492 + wm8350_free_irq(wm8350, WM8350_IRQ_EXT_WALL_FB, wm8350); 493 + free_ext_usb_fb: 494 + wm8350_free_irq(wm8350, WM8350_IRQ_EXT_USB_FB, wm8350); 495 + free_chg_vbatt_lt_2p85: 496 + wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85, wm8350); 497 + free_chg_vbatt_lt_3p1: 498 + wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1, wm8350); 499 + free_chg_vbatt_lt_3p9: 500 + wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9, wm8350); 501 + free_chg_fast_rdy: 502 + wm8350_free_irq(wm8350, WM8350_IRQ_CHG_FAST_RDY, wm8350); 503 + free_chg_start: 504 + wm8350_free_irq(wm8350, WM8350_IRQ_CHG_START, wm8350); 505 + free_chg_end: 506 + wm8350_free_irq(wm8350, WM8350_IRQ_CHG_END, wm8350); 507 + free_chg_to: 508 + wm8350_free_irq(wm8350, WM8350_IRQ_CHG_TO, wm8350); 509 + free_chg_bat_fail: 510 + wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL, wm8350); 511 + free_chg_bat_cold: 512 + wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD, wm8350); 513 + free_chg_bat_hot: 514 + wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT, wm8350); 515 + err: 516 + return ret; 449 517 } 450 518 451 519 static void free_charger_irq(struct wm8350 *wm8350)