summaryrefslogtreecommitdiff
path: root/drivers/staging
diff options
context:
space:
mode:
authorJeffrey Ladouceur <Jeffrey.Ladouceur@freescale.com>2014-10-22 21:06:26 (GMT)
committerMatthew Weigel <Matthew.Weigel@freescale.com>2014-12-11 18:40:07 (GMT)
commite33c2cd07f74802a4032d967f75c21f73cb438a0 (patch)
tree5ea9ca6a70424cb76710a4f83ebe99f08c21d2ef /drivers/staging
parent21061227575e90b6b4ac41f9847c1dd381181b66 (diff)
downloadlinux-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.c13
-rw-r--r--drivers/staging/fsl_qbman/qman_config.c12
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;
}