From 490f9b94e5f40edf2f9ffde7a108bbb42e3793c4 Mon Sep 17 00:00:00 2001 From: mahj8 Date: Thu, 4 Nov 2021 19:30:51 +0800 Subject: [PATCH] charging: avoid kernel panic avoid NULL pointer kernel panic <1>[ 4.240233] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000488 ...... <4>[ 4.240332] Call trace: <4>[ 4.240334] _raw_spin_lock_irqsave+0x40/0x74 <4>[ 4.240337] power_supply_changed+0x24/0x6c <4>[ 4.240341] batt_external_power_changed+0x44/0x54 [mmi_discrete_charger] <4>[ 4.240344] __power_supply_changed_work+0x50/0x88 <4>[ 4.240347] class_for_each_device+0xdc/0x148 <4>[ 4.240349] power_supply_changed_work+0x60/0xcc <4>[ 4.240352] process_one_work+0x2cc/0x51c <4>[ 4.240354] worker_thread+0x278/0x4d0 <4>[ 4.240356] kthread+0x16c/0x17c <4>[ 4.240358] ret_from_fork+0x10/0x18 <0>[ 4.240362] Code: 1100054a b900192a 52800029 f9800011 <4>[ 4.240364] --[ end trace 55041178414fca52 ]-- <0>[ 4.241541] Kernel panic - not syncing: Fatal exception Change-Id: I14e651a74cb6598fb2ba9fbad44e372c18fed024 Signed-off-by: mahj8 Reviewed-on: https://gerrit.mot.com/2107613 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Lu Chai Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- .../power/mmi_discrete_charger/mmi_discrete_charger_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c index 1438894b7da4..273700514c0d 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c @@ -1135,7 +1135,8 @@ static void batt_external_power_changed(struct power_supply *psy) cancel_delayed_work(&chip->charger_work); schedule_delayed_work(&chip->charger_work, msecs_to_jiffies(0)); - power_supply_changed(chip->batt_psy); + if (chip->batt_psy) + power_supply_changed(chip->batt_psy); } static const struct power_supply_desc batt_psy_desc = { @@ -2484,6 +2485,8 @@ static int mmi_discrete_probe(struct platform_device *pdev) else mmi_info(chip, "IPC logging is enabled for MMI DISCRETE\n"); + INIT_DELAYED_WORK(&chip->charger_work, mmi_discrete_charger_work); + chip->batt_psy = devm_power_supply_register(chip->dev, &batt_psy_desc, &psy_cfg); @@ -2518,7 +2521,6 @@ static int mmi_discrete_probe(struct platform_device *pdev) goto cleanup; } - INIT_DELAYED_WORK(&chip->charger_work, mmi_discrete_charger_work); mmi_discrete_charger_init(chip); usb_source_change_notify_handler(&chip->master_chg_nb, 0, &chip->master_chg_dev->noti);