From 480f3956fd0de25fcf266260fbd9fe294c641217 Mon Sep 17 00:00:00 2001 From: Puja Gupta Date: Mon, 28 Nov 2016 14:01:03 -0800 Subject: [PATCH] soc: qcom: Check err_ready before returning from subsys_generic_handler() Allow subsys_generic_handler() to check for err_ready interrupt before returning, so that subsystem_powerup() can complete successfully during ssr. CRs-Fixed: 1094829 Change-Id: I3e91bd2a2189508968f4c5cc62933a13986c6afa Signed-off-by: Puja Gupta --- drivers/soc/qcom/subsys-pil-tz.c | 41 ++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/drivers/soc/qcom/subsys-pil-tz.c b/drivers/soc/qcom/subsys-pil-tz.c index 1fa731776926..e70a56e7ce2e 100644 --- a/drivers/soc/qcom/subsys-pil-tz.c +++ b/drivers/soc/qcom/subsys-pil-tz.c @@ -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; } -- 2.11.0