u32 vcd_device_power_event(struct vcd_dev_ctxt *dev_ctxt, u32 event,
	struct vcd_clnt_ctxt *cctxt)
{
	u32 rc = VCD_ERR_FAIL;
	u32 set_perf_lvl;

	switch (event) {
	case VCD_EVT_PWR_DEV_INIT_BEGIN:
		if (dev_ctxt->pwr_clk_state == VCD_PWRCLK_STATE_OFF &&
				res_trk_get_max_perf_level(
				&dev_ctxt->max_perf_lvl) &&
				res_trk_power_up()) {
			dev_ctxt->pwr_clk_state =
				VCD_PWRCLK_STATE_ON_NOTCLOCKED;
			dev_ctxt->curr_perf_lvl = 0;
			dev_ctxt->reqd_perf_lvl = 0;
			dev_ctxt->active_clnts = 0;
			dev_ctxt->set_perf_lvl_pending = false;
			rc = vcd_enable_clock(dev_ctxt,	cctxt);
			if (VCD_FAILED(rc)) {
				res_trk_power_down();
				dev_ctxt->pwr_clk_state = VCD_PWRCLK_STATE_OFF;
			}
		}
		break;
	case VCD_EVT_PWR_DEV_INIT_END:
	case VCD_EVT_PWR_DEV_TERM_FAIL:
	case VCD_EVT_PWR_DEV_SLEEP_BEGIN:
	case VCD_EVT_PWR_DEV_HWTIMEOUT:
		rc = vcd_gate_clock(dev_ctxt);
		break;
	case VCD_EVT_PWR_DEV_INIT_FAIL:
	case VCD_EVT_PWR_DEV_TERM_END:
		if (dev_ctxt->pwr_clk_state != VCD_PWRCLK_STATE_OFF) {
			vcd_disable_clock(dev_ctxt);
			res_trk_power_down();

			dev_ctxt->pwr_clk_state = VCD_PWRCLK_STATE_OFF;
			dev_ctxt->curr_perf_lvl = 0;
			dev_ctxt->reqd_perf_lvl = 0;
			dev_ctxt->active_clnts = 0;
			dev_ctxt->set_perf_lvl_pending = false;
			rc = VCD_S_SUCCESS;
		}
		break;
	case VCD_EVT_PWR_DEV_TERM_BEGIN:
	case VCD_EVT_PWR_DEV_SLEEP_END:
		rc = vcd_un_gate_clock(dev_ctxt);
		break;
	case VCD_EVT_PWR_DEV_SET_PERFLVL:
		set_perf_lvl = dev_ctxt->reqd_perf_lvl > 0 ?
			dev_ctxt->reqd_perf_lvl : VCD_MIN_PERF_LEVEL;
		rc = vcd_set_perf_level(dev_ctxt, set_perf_lvl, cctxt);
		break;
	}
	return rc;
}
u32 vcd_client_power_event(struct vcd_dev_ctxt *dev_ctxt, struct vcd_clnt_ctxt
	*cctxt, u32 event)
{
	u32 rc = VCD_ERR_FAIL;

	switch (event) {
	case VCD_EVT_PWR_CLNT_CMD_BEGIN:
		rc = vcd_un_gate_clock(dev_ctxt);
		break;
	case VCD_EVT_PWR_CLNT_CMD_END:
		rc = vcd_gate_clock(dev_ctxt);
		break;
	case VCD_EVT_PWR_CLNT_CMD_FAIL:
		if (!vcd_core_is_busy(dev_ctxt))
			rc = vcd_gate_clock(dev_ctxt);
		break;
	case VCD_EVT_PWR_CLNT_PAUSE:
	case VCD_EVT_PWR_CLNT_LAST_FRAME:
	case VCD_EVT_PWR_CLNT_ERRFATAL:
		if (!cctxt)
			break;
		rc = VCD_S_SUCCESS;
		if (cctxt->status.req_perf_lvl) {
			dev_ctxt->reqd_perf_lvl -= cctxt->reqd_perf_lvl;
			cctxt->status.req_perf_lvl = false;

			rc = vcd_set_perf_level(dev_ctxt,
				dev_ctxt->reqd_perf_lvl, cctxt);
		}
		break;
	case VCD_EVT_PWR_CLNT_RESUME:
	case VCD_EVT_PWR_CLNT_FIRST_FRAME:
		if (!cctxt)
			break;
		rc = VCD_S_SUCCESS;
		if (!cctxt->status.req_perf_lvl) {
			dev_ctxt->reqd_perf_lvl += cctxt->reqd_perf_lvl;
			cctxt->status.req_perf_lvl = true;

			rc = vcd_set_perf_level(dev_ctxt,
				dev_ctxt->reqd_perf_lvl, cctxt);
		}
		break;
	}

	return rc;
}
u32 vcd_client_power_event(
	struct vcd_dev_ctxt_type *p_dev_ctxt,
    struct vcd_clnt_ctxt_type_t *p_cctxt, u32 event)
{
	u32 rc = VCD_ERR_FAIL;

	switch (event) {

	case VCD_EVT_PWR_CLNT_CMD_BEGIN:
		{
			rc = vcd_un_gate_clock(p_dev_ctxt);
			break;
		}

	case VCD_EVT_PWR_CLNT_CMD_END:
		{
			rc = vcd_gate_clock(p_dev_ctxt);
			break;
		}

	case VCD_EVT_PWR_CLNT_CMD_FAIL:
		{
			if (!vcd_core_is_busy(p_dev_ctxt))
				rc = vcd_gate_clock(p_dev_ctxt);

			break;
		}

	case VCD_EVT_PWR_CLNT_PAUSE:
	case VCD_EVT_PWR_CLNT_LAST_FRAME:
	case VCD_EVT_PWR_CLNT_ERRFATAL:
		{
			if (p_cctxt) {
				rc = VCD_S_SUCCESS;
				if (p_cctxt->status.b_req_perf_lvl) {
					p_dev_ctxt->n_reqd_perf_lvl -=
						p_cctxt->n_reqd_perf_lvl;
					p_cctxt->status.b_req_perf_lvl = FALSE;

					rc = vcd_set_perf_level(p_dev_ctxt,
						p_dev_ctxt->n_reqd_perf_lvl,
						p_cctxt);
				}
			}

			break;
		}

	case VCD_EVT_PWR_CLNT_RESUME:
	case VCD_EVT_PWR_CLNT_FIRST_FRAME:
		{
			if (p_cctxt) {
				rc = VCD_S_SUCCESS;
				if (!p_cctxt->status.b_req_perf_lvl) {
					p_dev_ctxt->n_reqd_perf_lvl +=
						p_cctxt->n_reqd_perf_lvl;
					p_cctxt->status.b_req_perf_lvl = TRUE;

					rc = vcd_set_perf_level(p_dev_ctxt,
						p_dev_ctxt->n_reqd_perf_lvl,
						p_cctxt);
				}
			}
			break;
		}
	}

	return rc;
}
u32 vcd_device_power_event(struct vcd_dev_ctxt_type *p_dev_ctxt, u32 event,
	struct vcd_clnt_ctxt_type_t *p_cctxt)
{
	u32 rc = VCD_ERR_FAIL;
	u32 n_set_perf_lvl;

	switch (event) {

	case VCD_EVT_PWR_DEV_INIT_BEGIN:
	{
		if (p_dev_ctxt->e_pwr_clk_state ==
			VCD_PWRCLK_STATE_OFF) {
			if (res_trk_get_max_perf_level(&p_dev_ctxt->
				n_max_perf_lvl)) {
				if (res_trk_power_up()) {
					p_dev_ctxt->e_pwr_clk_state =
					VCD_PWRCLK_STATE_ON_NOTCLOCKED;
					p_dev_ctxt->n_curr_perf_lvl = 0;
					p_dev_ctxt->n_reqd_perf_lvl = 0;
					p_dev_ctxt->n_active_clnts = 0;
					p_dev_ctxt->
						b_set_perf_lvl_pending = FALSE;
					rc = vcd_enable_clock(p_dev_ctxt,
						p_cctxt);
					if (VCD_FAILED(rc)) {
						(void)res_trk_power_down();
						p_dev_ctxt->e_pwr_clk_state =
							VCD_PWRCLK_STATE_OFF;
					}
				}
			}
		}

		break;
	}

	case VCD_EVT_PWR_DEV_INIT_END:
	case VCD_EVT_PWR_DEV_TERM_FAIL:
	case VCD_EVT_PWR_DEV_SLEEP_BEGIN:
	case VCD_EVT_PWR_DEV_HWTIMEOUT:
		{
			rc = vcd_gate_clock(p_dev_ctxt);

			break;
		}

	case VCD_EVT_PWR_DEV_INIT_FAIL:
	case VCD_EVT_PWR_DEV_TERM_END:
		{
			if (p_dev_ctxt->e_pwr_clk_state !=
				VCD_PWRCLK_STATE_OFF) {
				(void)vcd_disable_clock(p_dev_ctxt);
				(void)res_trk_power_down();

				p_dev_ctxt->e_pwr_clk_state =
				    VCD_PWRCLK_STATE_OFF;
				p_dev_ctxt->n_curr_perf_lvl = 0;
				p_dev_ctxt->n_reqd_perf_lvl = 0;
				p_dev_ctxt->n_active_clnts = 0;
				p_dev_ctxt->b_set_perf_lvl_pending = FALSE;
				rc = VCD_S_SUCCESS;
			}

			break;
		}

	case VCD_EVT_PWR_DEV_TERM_BEGIN:
	case VCD_EVT_PWR_DEV_SLEEP_END:
		{
			rc = vcd_un_gate_clock(p_dev_ctxt);

			break;
		}

	case VCD_EVT_PWR_DEV_SET_PERFLVL:
		{
			n_set_perf_lvl =
			    p_dev_ctxt->n_reqd_perf_lvl >
			    0 ? p_dev_ctxt->
			    n_reqd_perf_lvl : VCD_MIN_PERF_LEVEL;

			rc = vcd_set_perf_level(p_dev_ctxt, n_set_perf_lvl,
				p_cctxt);

			break;
		}
	}
	return rc;
}