Merge "soc: qcom: Check err_ready before returning from subsys_generic_handler()"

This commit is contained in:
Linux Build Service Account 2016-12-06 14:33:56 -08:00 committed by Gerrit - the friendly Code Review server
commit 69352ff8b4

View file

@ -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;
}