Skip to content

Commit cc20bc0

Browse files
power-xsfrkhuangtao
authored andcommitted
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 hardkernel#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 <[email protected]>
1 parent aa6998b commit cc20bc0

File tree

1 file changed

+7
-37
lines changed

1 file changed

+7
-37
lines changed

drivers/power/rk817_charger.c

Lines changed: 7 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -327,36 +327,6 @@ struct rk817_charger {
327327
int plugout_irq;
328328
};
329329

330-
static const struct regmap_range rk817_charge_readonly_reg_ranges[] = {
331-
regmap_reg_range(0xEB, 0xEB),
332-
};
333-
334-
static const struct regmap_access_table rk817_charge_writeable_regs = {
335-
.no_ranges = rk817_charge_readonly_reg_ranges,
336-
.n_no_ranges = ARRAY_SIZE(rk817_charge_readonly_reg_ranges),
337-
};
338-
339-
static const struct regmap_range rk817_charge_volatile_reg_ranges[] = {
340-
regmap_reg_range(0xB4, 0xB4),
341-
regmap_reg_range(0xE4, 0xEA),
342-
regmap_reg_range(0xEC, 0xEC),
343-
};
344-
345-
static const struct regmap_access_table rk817_charge_volatile_regs = {
346-
.yes_ranges = rk817_charge_volatile_reg_ranges,
347-
.n_yes_ranges = ARRAY_SIZE(rk817_charge_volatile_reg_ranges),
348-
};
349-
350-
static const struct regmap_config rk817_charge_regmap_config = {
351-
.reg_bits = 8,
352-
.val_bits = 8,
353-
354-
.max_register = 0xFF,
355-
.cache_type = REGCACHE_RBTREE,
356-
.wr_table = &rk817_charge_writeable_regs,
357-
.volatile_table = &rk817_charge_volatile_regs,
358-
};
359-
360330
static enum power_supply_property rk817_ac_props[] = {
361331
POWER_SUPPLY_PROP_ONLINE,
362332
POWER_SUPPLY_PROP_STATUS,
@@ -1552,8 +1522,7 @@ static int rk817_charge_probe(struct platform_device *pdev)
15521522
charge->client = client;
15531523
platform_set_drvdata(pdev, charge);
15541524

1555-
charge->regmap = devm_regmap_init_i2c(client,
1556-
&rk817_charge_regmap_config);
1525+
charge->regmap = rk817->regmap;
15571526
if (IS_ERR(charge->regmap)) {
15581527
dev_err(charge->dev, "Failed to initialize regmap\n");
15591528
return -EINVAL;
@@ -1580,6 +1549,12 @@ static int rk817_charge_probe(struct platform_device *pdev)
15801549

15811550
rk817_charge_pre_init(charge);
15821551

1552+
ret = rk817_charge_init_power_supply(charge);
1553+
if (ret) {
1554+
dev_err(charge->dev, "init power supply fail!\n");
1555+
return ret;
1556+
}
1557+
15831558
ret = rk817_charge_init_dc(charge);
15841559
if (ret) {
15851560
dev_err(charge->dev, "init dc failed!\n");
@@ -1591,11 +1566,6 @@ static int rk817_charge_probe(struct platform_device *pdev)
15911566
dev_err(charge->dev, "init usb failed!\n");
15921567
return ret;
15931568
}
1594-
ret = rk817_charge_init_power_supply(charge);
1595-
if (ret) {
1596-
dev_err(charge->dev, "init power supply fail!\n");
1597-
return ret;
1598-
}
15991569

16001570
ret = rk817_charge_init_irqs(charge);
16011571
if (ret) {

0 commit comments

Comments
 (0)