Merge "soc: qcom: Check err_ready before returning from subsys_generic_handler()"
This commit is contained in:
commit
69352ff8b4
1 changed files with 23 additions and 18 deletions
|
@ -911,7 +911,7 @@ static irqreturn_t subsys_stop_ack_intr_handler(int irq, void *dev_id)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void check_pbl_done(struct pil_tz_data *d)
|
||||
static void clear_pbl_done(struct pil_tz_data *d)
|
||||
{
|
||||
uint32_t err_value;
|
||||
|
||||
|
@ -938,17 +938,18 @@ static void check_pbl_done(struct pil_tz_data *d)
|
|||
__raw_writel(BIT(d->bits_arr[PBL_DONE]), d->irq_clear);
|
||||
}
|
||||
|
||||
static void check_err_ready(struct pil_tz_data *d)
|
||||
static void clear_err_ready(struct pil_tz_data *d)
|
||||
{
|
||||
uint32_t err_value;
|
||||
|
||||
err_value = __raw_readl(d->err_status_spare);
|
||||
if (!err_value) {
|
||||
pr_debug("Subsystem error services up received from %s!\n",
|
||||
pr_debug("Subsystem error services up received from %s!\n",
|
||||
d->subsys_desc.name);
|
||||
__raw_writel(BIT(d->bits_arr[ERR_READY]), d->irq_clear);
|
||||
complete_err_ready(d->subsys);
|
||||
} else if (err_value == 0x44554d50) {
|
||||
__raw_writel(BIT(d->bits_arr[ERR_READY]), d->irq_clear);
|
||||
complete_err_ready(d->subsys);
|
||||
}
|
||||
|
||||
static void clear_wdog(struct pil_tz_data *d)
|
||||
{
|
||||
/* Check crash status to know if device is restarting*/
|
||||
if (!subsys_get_crash_status(d->subsys)) {
|
||||
pr_err("wdog bite received from %s!\n", d->subsys_desc.name);
|
||||
__raw_writel(BIT(d->bits_arr[ERR_READY]), d->irq_clear);
|
||||
subsys_set_crash_status(d->subsys, true);
|
||||
|
@ -960,17 +961,21 @@ static void check_err_ready(struct pil_tz_data *d)
|
|||
static irqreturn_t subsys_generic_handler(int irq, void *dev_id)
|
||||
{
|
||||
struct pil_tz_data *d = subsys_to_data(dev_id);
|
||||
uint32_t status_val;
|
||||
|
||||
if (subsys_get_crash_status(d->subsys))
|
||||
return IRQ_HANDLED;
|
||||
uint32_t status_val, err_value;
|
||||
|
||||
err_value = __raw_readl(d->err_status_spare);
|
||||
status_val = __raw_readl(d->irq_status);
|
||||
|
||||
if (status_val & BIT(d->bits_arr[ERR_READY]))
|
||||
check_err_ready(d);
|
||||
else if (status_val & BIT(d->bits_arr[PBL_DONE]))
|
||||
check_pbl_done(d);
|
||||
if ((status_val & BIT(d->bits_arr[ERR_READY])) && !err_value)
|
||||
clear_err_ready(d);
|
||||
|
||||
if ((status_val & BIT(d->bits_arr[ERR_READY])) &&
|
||||
err_value == 0x44554d50)
|
||||
clear_wdog(d);
|
||||
|
||||
if (status_val & BIT(d->bits_arr[PBL_DONE]))
|
||||
clear_pbl_done(d);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue