From cc20bc020b16e9b924de509e2bcdfd1fae6bc99e Mon Sep 17 00:00:00 2001 From: shengfei Xu Date: Fri, 8 Jun 2018 10:40:19 +0800 Subject: [PATCH] power: rk817_charger: fix NULL pointer dereference in rk817_charger_evt_worker Power supply is not registered, however calling power_supply_changed() directly from rk817_charger_evt_worker(). This may cause kernel panic with the following log: [ 0.951781] Unable to handle kernel NULL pointer dereference at virtual address 0000040c [ 0.952499] pgd = ffffff80092c5000 [ 0.952813] [0000040c] *pgd=000000007fffe003, *pud=000000007fffe003, *pmd=0000000000000000 [ 0.953582] Internal error: Oops: 96000005 [#1] SMP [ 0.954020] Modules linked in: [ 0.954322] CPU: 0 PID: 34 Comm: kworker/0:1 Not tainted 4.4.132 #36 [ 0.954881] Hardware name: Rockchip rk3326 evb linux board (DT) [ 0.955427] Workqueue: events rk817_charger_evt_worker [ 0.955899] task: ffffffc00029b600 task.stack: ffffffc07d124000 [ 0.956433] PC is at do_raw_spin_lock+0x20/0x164 [ 0.956856] LR is at _raw_spin_lock_irqsave+0x28/0x38 Change-Id: I49454ded72f6679a10df499511a4c7a40324dc85 Signed-off-by: shengfei Xu --- drivers/power/rk817_charger.c | 44 ++++++----------------------------- 1 file changed, 7 insertions(+), 37 deletions(-) diff --git a/drivers/power/rk817_charger.c b/drivers/power/rk817_charger.c index dfd1c98ad2ef..8f6d3cf4cd62 100644 --- a/drivers/power/rk817_charger.c +++ b/drivers/power/rk817_charger.c @@ -327,36 +327,6 @@ struct rk817_charger { int plugout_irq; }; -static const struct regmap_range rk817_charge_readonly_reg_ranges[] = { - regmap_reg_range(0xEB, 0xEB), -}; - -static const struct regmap_access_table rk817_charge_writeable_regs = { - .no_ranges = rk817_charge_readonly_reg_ranges, - .n_no_ranges = ARRAY_SIZE(rk817_charge_readonly_reg_ranges), -}; - -static const struct regmap_range rk817_charge_volatile_reg_ranges[] = { - regmap_reg_range(0xB4, 0xB4), - regmap_reg_range(0xE4, 0xEA), - regmap_reg_range(0xEC, 0xEC), -}; - -static const struct regmap_access_table rk817_charge_volatile_regs = { - .yes_ranges = rk817_charge_volatile_reg_ranges, - .n_yes_ranges = ARRAY_SIZE(rk817_charge_volatile_reg_ranges), -}; - -static const struct regmap_config rk817_charge_regmap_config = { - .reg_bits = 8, - .val_bits = 8, - - .max_register = 0xFF, - .cache_type = REGCACHE_RBTREE, - .wr_table = &rk817_charge_writeable_regs, - .volatile_table = &rk817_charge_volatile_regs, -}; - static enum power_supply_property rk817_ac_props[] = { POWER_SUPPLY_PROP_ONLINE, POWER_SUPPLY_PROP_STATUS, @@ -1552,8 +1522,7 @@ static int rk817_charge_probe(struct platform_device *pdev) charge->client = client; platform_set_drvdata(pdev, charge); - charge->regmap = devm_regmap_init_i2c(client, - &rk817_charge_regmap_config); + charge->regmap = rk817->regmap; if (IS_ERR(charge->regmap)) { dev_err(charge->dev, "Failed to initialize regmap\n"); return -EINVAL; @@ -1580,6 +1549,12 @@ static int rk817_charge_probe(struct platform_device *pdev) rk817_charge_pre_init(charge); + ret = rk817_charge_init_power_supply(charge); + if (ret) { + dev_err(charge->dev, "init power supply fail!\n"); + return ret; + } + ret = rk817_charge_init_dc(charge); if (ret) { dev_err(charge->dev, "init dc failed!\n"); @@ -1591,11 +1566,6 @@ static int rk817_charge_probe(struct platform_device *pdev) dev_err(charge->dev, "init usb failed!\n"); return ret; } - ret = rk817_charge_init_power_supply(charge); - if (ret) { - dev_err(charge->dev, "init power supply fail!\n"); - return ret; - } ret = rk817_charge_init_irqs(charge); if (ret) {