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:
parent
aa6998b51a
commit
cc20bc020b
1 changed files with 7 additions and 37 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue