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;
|
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;
|
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);
|
__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;
|
pr_debug("Subsystem error services up received from %s!\n",
|
||||||
|
|
||||||
err_value = __raw_readl(d->err_status_spare);
|
|
||||||
if (!err_value) {
|
|
||||||
pr_debug("Subsystem error services up received from %s!\n",
|
|
||||||
d->subsys_desc.name);
|
d->subsys_desc.name);
|
||||||
__raw_writel(BIT(d->bits_arr[ERR_READY]), d->irq_clear);
|
__raw_writel(BIT(d->bits_arr[ERR_READY]), d->irq_clear);
|
||||||
complete_err_ready(d->subsys);
|
complete_err_ready(d->subsys);
|
||||||
} else if (err_value == 0x44554d50) {
|
}
|
||||||
|
|
||||||
|
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);
|
pr_err("wdog bite received from %s!\n", d->subsys_desc.name);
|
||||||
__raw_writel(BIT(d->bits_arr[ERR_READY]), d->irq_clear);
|
__raw_writel(BIT(d->bits_arr[ERR_READY]), d->irq_clear);
|
||||||
subsys_set_crash_status(d->subsys, true);
|
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)
|
static irqreturn_t subsys_generic_handler(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
struct pil_tz_data *d = subsys_to_data(dev_id);
|
struct pil_tz_data *d = subsys_to_data(dev_id);
|
||||||
uint32_t status_val;
|
uint32_t status_val, err_value;
|
||||||
|
|
||||||
if (subsys_get_crash_status(d->subsys))
|
|
||||||
return IRQ_HANDLED;
|
|
||||||
|
|
||||||
|
err_value = __raw_readl(d->err_status_spare);
|
||||||
status_val = __raw_readl(d->irq_status);
|
status_val = __raw_readl(d->irq_status);
|
||||||
|
|
||||||
if (status_val & BIT(d->bits_arr[ERR_READY]))
|
if ((status_val & BIT(d->bits_arr[ERR_READY])) && !err_value)
|
||||||
check_err_ready(d);
|
clear_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 == 0x44554d50)
|
||||||
|
clear_wdog(d);
|
||||||
|
|
||||||
|
if (status_val & BIT(d->bits_arr[PBL_DONE]))
|
||||||
|
clear_pbl_done(d);
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue