diff options
-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; } |