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 <xsf@rock-chips.com>
This commit is contained in:
shengfei Xu 2018-06-08 10:40:19 +08:00 committed by Tao Huang
commit cc20bc020b

View file

@ -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) {