regulator: cpr3: fix panic callback failure in interrupt context

The kernel panic could happen in CPU interrupt context. CPR3 panic
callback function does ioremap which cannot be executed in an interrupt
context. Fix the issue by doing a ioremap during driver initialization.

CRs-Fixed: 1056786
Change-Id: I191127fafb26bcf10ea25f972fe5af122debf292
Signed-off-by: Tirupathi Reddy <tirupath@codeaurora.org>
This commit is contained in:
Tirupathi Reddy 2016-08-19 12:16:03 +05:30 committed by Gerrit - the friendly Code Review server
parent c605e110ab
commit d729a21fd9
3 changed files with 9 additions and 4 deletions

View file

@ -5935,14 +5935,11 @@ static int cpr3_panic_callback(struct notifier_block *nfb,
struct cpr3_controller, panic_notifier);
struct cpr3_panic_regs_info *regs_info = ctrl->panic_regs_info;
struct cpr3_reg_info *reg;
void __iomem *virt_addr;
int i = 0;
for (i = 0; i < regs_info->reg_count; i++) {
reg = &(regs_info->regs[i]);
virt_addr = ioremap(reg->addr, 0x4);
reg->value = readl_relaxed(virt_addr);
iounmap(virt_addr);
reg->value = readl_relaxed(reg->virt_addr);
pr_err("%s[0x%08x] = 0x%08x\n", reg->name, reg->addr,
reg->value);
}

View file

@ -498,6 +498,7 @@ struct cpr3_aging_sensor_info {
* @name: Register name
* @addr: Register physical address
* @value: Register content
* @virt_addr: Register virtual address
*
* This data structure is used to dump some critical register contents
* when the device crashes due to a kernel panic.
@ -506,6 +507,7 @@ struct cpr3_reg_info {
const char *name;
u32 addr;
u32 value;
void __iomem *virt_addr;
};
/**

View file

@ -1078,6 +1078,12 @@ static int cpr3_panic_notifier_init(struct cpr3_controller *ctrl)
rc);
return rc;
}
regs[i].virt_addr = devm_ioremap(ctrl->dev, regs[i].addr, 0x4);
if (!regs[i].virt_addr) {
pr_err("Unable to map panic register addr 0x%08x\n",
regs[i].addr);
return -EINVAL;
}
regs[i].value = 0xFFFFFFFF;
}