BC_STATUS crystalhd_hw_close(struct crystalhd_hw *hw, struct crystalhd_adp *adp) { if (!hw) { printk(KERN_ERR "%s: Invalid Arguments\n", __func__); return BC_STS_SUCCESS; } if (!hw->dev_started) return BC_STS_SUCCESS; /* Stop and DDR sleep will happen in here */ /* Only stop the HW if we are the last user */ if(adp->cfg_users == 1) crystalhd_hw_suspend(hw); hw->dev_started = false; return BC_STS_SUCCESS; }
/** * crystalhd_suspend - Power management suspend request. * @ctx: Command layer context. * @idata: Iodata - required for internal use. * * Return: * status * * 1. Set the state to Suspend. * 2. Flush the Rx Buffers it will unmap all the buffers and * stop the RxDMA engine. * 3. Cancel The TX Io and Stop Dma Engine. * 4. Put the DDR in to deep sleep. * 5. Stop the hardware putting it in to Reset State. * * Current gstreamer frame work does not provide any power management * related notification to user mode decoder plug-in. As a work-around * we pass on the power mangement notification to our plug-in by completing * all outstanding requests with BC_STS_IO_USER_ABORT return code. */ enum BC_STATUS crystalhd_suspend(struct crystalhd_cmd *ctx, struct crystalhd_ioctl_data *idata) { enum BC_STATUS sts = BC_STS_SUCCESS; if (!ctx || !idata) { BCMLOG_ERR("Invalid Parameters\n"); return BC_STS_ERROR; } if (ctx->state & BC_LINK_SUSPEND) return BC_STS_SUCCESS; if (ctx->state == BC_LINK_INVALID) { BCMLOG(BCMLOG_DBG, "Nothing To Do Suspend Success\n"); return BC_STS_SUCCESS; } ctx->state |= BC_LINK_SUSPEND; bc_cproc_mark_pwr_state(ctx); if (ctx->state & BC_LINK_CAP_EN) { sts = bc_cproc_flush_cap_buffs(ctx, idata); if (sts != BC_STS_SUCCESS) return sts; } if (ctx->tx_list_id) { sts = crystalhd_hw_cancel_tx(&ctx->hw_ctx, ctx->tx_list_id); if (sts != BC_STS_SUCCESS) return sts; } sts = crystalhd_hw_suspend(&ctx->hw_ctx); if (sts != BC_STS_SUCCESS) return sts; BCMLOG(BCMLOG_DBG, "BCM70012 suspend success\n"); return BC_STS_SUCCESS; }