void vcd_handle_device_init_failed(struct vcd_drv_ctxt *drv_ctxt, u32 status) { struct vcd_clnt_ctxt *client; struct vcd_clnt_ctxt *tmp_client; VCD_MSG_ERROR("Device init failed. status = %d", status); client = drv_ctxt->dev_ctxt.cctxt_list_head; while (client) { client->callback(VCD_EVT_RESP_OPEN, status, NULL, 0, 0, client->client_data); tmp_client = client; client = client->next; vcd_destroy_client_context(tmp_client); } if (ddl_device_release(NULL)) VCD_MSG_ERROR("Failed: ddl_device_release"); vcd_sched_destroy(&drv_ctxt->dev_ctxt.sched_clnt_list); if (vcd_power_event(&drv_ctxt->dev_ctxt, NULL, VCD_EVT_PWR_DEV_INIT_FAIL)) VCD_MSG_ERROR("VCD_EVT_PWR_DEV_INIT_FAIL failed"); vcd_do_device_state_transition(drv_ctxt, VCD_DEVICE_STATE_NOT_INIT, DEVICE_STATE_EVENT_NUMBER(dev_cb)); }
u32 vcd_deinit_device_context(struct vcd_drv_ctxt *drv_ctxt, u32 ev_code) { struct vcd_dev_ctxt *dev_ctxt = &drv_ctxt->dev_ctxt; u32 rc = VCD_S_SUCCESS; VCD_MSG_LOW("vcd_deinit_device_context:"); rc = vcd_power_event(&drv_ctxt->dev_ctxt, NULL, VCD_EVT_PWR_DEV_TERM_BEGIN); VCD_FAILED_RETURN(rc, "VCD_EVT_PWR_DEV_TERM_BEGIN failed"); rc = ddl_device_release(NULL); if (VCD_FAILED(rc)) { VCD_MSG_ERROR("rc = 0x%x. Failed: ddl_device_release", rc); (void)vcd_power_event(dev_ctxt, NULL, VCD_EVT_PWR_DEV_TERM_FAIL); } else { vcd_sched_destroy(&dev_ctxt->sched_clnt_list); (void) vcd_power_event(dev_ctxt, NULL, VCD_EVT_PWR_DEV_TERM_END); vcd_do_device_state_transition(drv_ctxt, VCD_DEVICE_STATE_NOT_INIT, ev_code); } return rc; }
u32 vcd_init_device_context(struct vcd_drv_ctxt *drv_ctxt, u32 ev_code) { struct vcd_dev_ctxt *dev_ctxt = &drv_ctxt->dev_ctxt; u32 rc; struct ddl_init_config ddl_init; VCD_MSG_LOW("vcd_init_device_context:"); dev_ctxt->pending_cmd = VCD_CMD_NONE; rc = vcd_power_event(dev_ctxt, NULL, VCD_EVT_PWR_DEV_INIT_BEGIN); VCD_FAILED_RETURN(rc, "VCD_EVT_PWR_DEV_INIT_BEGIN failed"); VCD_MSG_HIGH("Device powered ON and clocked"); rc = vcd_sched_create(&dev_ctxt->sched_clnt_list); if (VCD_FAILED(rc)) { VCD_MSG_ERROR("rc = 0x%x. Failed: vcd_sched_create", rc); (void)vcd_power_event(dev_ctxt, NULL, VCD_EVT_PWR_DEV_INIT_FAIL); return rc; } VCD_MSG_HIGH("Created scheduler instance."); ddl_init.core_virtual_base_addr = dev_ctxt->device_base_addr; ddl_init.interrupt_clr = dev_ctxt->config.interrupt_clr; ddl_init.ddl_callback = vcd_ddl_callback; rc = ddl_device_init(&ddl_init, NULL); if (VCD_FAILED(rc)) { VCD_MSG_ERROR("rc = 0x%x. Failed: ddl_device_init", rc); vcd_sched_destroy(&dev_ctxt->sched_clnt_list); (void)vcd_power_event(dev_ctxt, NULL, VCD_EVT_PWR_DEV_INIT_FAIL); } else { vcd_device_timer_start(dev_ctxt); vcd_do_device_state_transition(drv_ctxt, VCD_DEVICE_STATE_INITING, ev_code); } #if 1//FEATURE_PANTECH_MMP_QCOM_CR , QC Case#00859255 for[WTR]Video lagging issue dev_ctxt->turbo_mode_set = 0; #endif //QC Case#00859255 for[WTR]Video lagging issue return rc; }