int msm_gemini_hw_exec_cmds(struct msm_gemini_hw_cmd *hw_cmd_p, uint32_t m_cmds) { int is_copy_to_user = -1; uint32_t data; while (m_cmds--) { if (hw_cmd_p->offset > gemini_region_size) { GMN_PR_ERR("%s:%d] %d exceed hw region %d\n", __func__, __LINE__, hw_cmd_p->offset, gemini_region_size); return -EFAULT; } switch (hw_cmd_p->type) { case MSM_GEMINI_HW_CMD_TYPE_READ: hw_cmd_p->data = msm_gemini_hw_read(hw_cmd_p); is_copy_to_user = 1; break; case MSM_GEMINI_HW_CMD_TYPE_WRITE: msm_gemini_hw_write(hw_cmd_p); break; case MSM_GEMINI_HW_CMD_TYPE_WRITE_OR: data = msm_gemini_hw_read(hw_cmd_p); hw_cmd_p->data = (hw_cmd_p->data & hw_cmd_p->mask) | data; msm_gemini_hw_write(hw_cmd_p); break; case MSM_GEMINI_HW_CMD_TYPE_UWAIT: msm_gemini_hw_wait(hw_cmd_p, 1); break; case MSM_GEMINI_HW_CMD_TYPE_MWAIT: msm_gemini_hw_wait(hw_cmd_p, 1000); break; case MSM_GEMINI_HW_CMD_TYPE_UDELAY: msm_gemini_hw_delay(hw_cmd_p, 1); break; case MSM_GEMINI_HW_CMD_TYPE_MDELAY: msm_gemini_hw_delay(hw_cmd_p, 1000); break; default: GMN_PR_ERR("wrong hw command type\n"); break; } hw_cmd_p++; } return is_copy_to_user; }
long msm_gemini_hw_encode_output_size(void) { uint32_t encode_output_size = 0; encode_output_size = msm_gemini_hw_read(&hw_cmd_encode_output_size[0]); return encode_output_size; }
int msm_gemini_hw_irq_get_status(void) { uint32_t n_irq_status = 0; rmb(); n_irq_status = msm_gemini_hw_read(&hw_cmd_irq_get_status[0]); rmb(); return n_irq_status; }
int msm_gemini_hw_wait(struct msm_gemini_hw_cmd *hw_cmd_p, int m_us) { int tm = hw_cmd_p->n; uint32_t data; uint32_t wait_data = hw_cmd_p->data & hw_cmd_p->mask; data = msm_gemini_hw_read(hw_cmd_p); if (data != wait_data) { while (tm) { udelay(m_us); data = msm_gemini_hw_read(hw_cmd_p); if (data == wait_data) break; tm--; } } hw_cmd_p->data = data; return tm; }