From ed73b95dec167d9c8c8920503cb55e64700b3920 Mon Sep 17 00:00:00 2001 From: chenjh Date: Thu, 18 May 2017 14:58:02 +0800 Subject: power: rk818-charger: move irq init to the last step init irq later than workqueue_struct and delayed_work to avoid NULL ponint Change-Id: I715296a715cb07149a6dce236a3b8ccafe00622e Signed-off-by: chenjh --- drivers/power/rk818_charger.c | 47 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/drivers/power/rk818_charger.c b/drivers/power/rk818_charger.c index 00146303d27e..3bc89d12d276 100644 --- a/drivers/power/rk818_charger.c +++ b/drivers/power/rk818_charger.c @@ -1379,12 +1379,6 @@ static int rk818_charger_probe(struct platform_device *pdev) return ret; } - ret = rk818_cg_init_irqs(cg); - if (ret != 0) { - dev_err(cg->dev, "init irqs failed!\n"); - return ret; - } - rk818_cg_init_ts2_detect(cg); ret = rk818_cg_init_dc(cg); @@ -1407,8 +1401,49 @@ static int rk818_charger_probe(struct platform_device *pdev) rk818_cg_init_charger_state(cg); + ret = rk818_cg_init_irqs(cg); + if (ret) { + dev_err(cg->dev, "init irqs failed!\n"); + goto irq_fail; + } + CG_INFO("driver version: %s\n", DRIVER_VERSION); + return 0; + +irq_fail: + + /* type-c only */ + if (cg->pdata->extcon) { + cancel_delayed_work_sync(&cg->host_work); + cancel_delayed_work_sync(&cg->discnt_work); + } + + cancel_delayed_work_sync(&cg->usb_work); + cancel_delayed_work_sync(&cg->dc_work); + cancel_delayed_work_sync(&cg->finish_sig_work); + cancel_delayed_work_sync(&cg->irq_work); + cancel_delayed_work_sync(&cg->ts2_vol_work); + destroy_workqueue(cg->ts2_wq); + destroy_workqueue(cg->usb_charger_wq); + destroy_workqueue(cg->dc_charger_wq); + destroy_workqueue(cg->finish_sig_wq); + + if (cg->pdata->extcon) { + extcon_unregister_notifier(cg->cable_edev, EXTCON_CHG_USB_SDP, + &cg->cable_cg_nb); + extcon_unregister_notifier(cg->cable_edev, EXTCON_CHG_USB_DCP, + &cg->cable_cg_nb); + extcon_unregister_notifier(cg->cable_edev, EXTCON_CHG_USB_CDP, + &cg->cable_cg_nb); + extcon_unregister_notifier(cg->cable_edev, EXTCON_USB_VBUS_EN, + &cg->cable_host_nb); + extcon_unregister_notifier(cg->cable_edev, EXTCON_USB, + &cg->cable_discnt_nb); + } else { + rk_bc_detect_notifier_unregister(&cg->bc_nb); + } + return ret; } -- cgit v1.2.3