diff options
author | Jeffrey Ladouceur <Jeffrey.Ladouceur@freescale.com> | 2014-10-22 21:06:26 (GMT) |
---|---|---|
committer | Matthew Weigel <Matthew.Weigel@freescale.com> | 2014-12-11 18:40:07 (GMT) |
commit | e33c2cd07f74802a4032d967f75c21f73cb438a0 (patch) | |
tree | 5ea9ca6a70424cb76710a4f83ebe99f08c21d2ef /drivers/staging | |
parent | 21061227575e90b6b4ac41f9847c1dd381181b66 (diff) | |
download | linux-fsl-qoriq-e33c2cd07f74802a4032d967f75c21f73cb438a0.tar.xz |
qbman: Add check that suspend will succeed
Ensure that idle line is asserted before leaving suspend function.
If not, fail the request as system could hang waiting for idle line
to be asserted which might never happen.
Signed-off-by: Jeffrey Ladouceur <Jeffrey.Ladouceur@freescale.com>
Change-Id: I95390751160b8825d58d9c04a6884b37e91424b4
Reviewed-on: http://git.am.freescale.net:8181/21956
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
Reviewed-by: Geoff Thorpe <Geoff.Thorpe@freescale.com>
Reviewed-by: Haiying Wang <Haiying.Wang@freescale.com>
Reviewed-by: Richard Schmitt <richard.schmitt@freescale.com>
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/fsl_qbman/bman_config.c | 13 | ||||
-rw-r--r-- | drivers/staging/fsl_qbman/qman_config.c | 12 |
2 files changed, 21 insertions, 4 deletions
diff --git a/drivers/staging/fsl_qbman/bman_config.c b/drivers/staging/fsl_qbman/bman_config.c index efba359..b52f77b 100644 --- a/drivers/staging/fsl_qbman/bman_config.c +++ b/drivers/staging/fsl_qbman/bman_config.c @@ -670,14 +670,23 @@ static u32 saved_isdr; static int bman_pm_suspend_noirq(struct device *dev) { + uint32_t idle_state; + suspend_unused_bportal(); /* save isdr, disable all, clear isr */ saved_isdr = bm_err_isr_disable_read(bm); bm_err_isr_disable_write(bm, 0xffffffff); bm_err_isr_status_clear(bm, 0xffffffff); - /* should be idle, otherwise abort ? */ + + idle_state = bm_in(STATE_IDLE); + if (!(idle_state & 0x1)) { + pr_err("Bman not idle 0x%x aborting\n", idle_state); + bm_err_isr_disable_write(bm, saved_isdr); + resume_unused_bportal(); + return -EBUSY; + } #ifdef CONFIG_PM_DEBUG - pr_info("Bman suspend code, IDLE_STAT = 0x%x\n", bm_in(STATE_IDLE)); + pr_info("Bman suspend code, IDLE_STAT = 0x%x\n", idle_state); #endif return 0; } diff --git a/drivers/staging/fsl_qbman/qman_config.c b/drivers/staging/fsl_qbman/qman_config.c index 706d3ec..1056383 100644 --- a/drivers/staging/fsl_qbman/qman_config.c +++ b/drivers/staging/fsl_qbman/qman_config.c @@ -1094,14 +1094,22 @@ MODULE_DEVICE_TABLE(of, of_fsl_qman_ids); static u32 saved_isdr; static int qman_pm_suspend_noirq(struct device *dev) { + uint32_t idle_state; + suspend_unused_qportal(); /* save isdr, disable all, clear isr */ saved_isdr = qm_err_isr_disable_read(qm); qm_err_isr_disable_write(qm, 0xffffffff); qm_err_isr_status_clear(qm, 0xffffffff); - /* should be idle, otherwise abort ? */ + idle_state = qm_in(IDLE_STAT); + if (!(idle_state & 0x1)) { + pr_err("Qman not idle 0x%x aborting\n", idle_state); + qm_err_isr_disable_write(qm, saved_isdr); + resume_unused_qportal(); + return -EBUSY; + } #ifdef CONFIG_PM_DEBUG - pr_info("Qman suspend code, IDLE_STAT = 0x%x\n", qm_in(IDLE_STAT)); + pr_info("Qman suspend code, IDLE_STAT = 0x%x\n", idle_state); #endif return 0; } |