int msm_gemini_hw_exec_cmds(struct msm_gemini_hw_cmd *hw_cmd_p, int 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; }
void msm_gemini_hw_reset(void *base, int size) { struct msm_gemini_hw_cmd *hw_cmd_p; hw_cmd_p = &hw_cmd_reset[0]; wmb(); msm_gemini_hw_write(hw_cmd_p++); msm_gemini_hw_write(hw_cmd_p++); msm_gemini_hw_write(hw_cmd_p++); msm_gemini_hw_write(hw_cmd_p); wmb(); return; }
void msm_gemini_hw_irq_clear(uint32_t mask, uint32_t data) { GMN_DBG("%s:%d] mask %0x data %0x", __func__, __LINE__, mask, data); hw_cmd_irq_clear[0].mask = mask; hw_cmd_irq_clear[0].data = data; msm_gemini_hw_write(&hw_cmd_irq_clear[0]); }
void msm_gemini_hw_we_buffer_update(struct msm_gemini_hw_buf *p_input, uint8_t pingpong_index) { uint32_t n_reg_val = 0; struct msm_gemini_hw_cmd *hw_cmd_p; GMN_DBG("%s:%d] pingpong index %d", __func__, __LINE__, pingpong_index); if (pingpong_index == 0) { hw_cmd_p = &hw_cmd_we_ping_update[0]; n_reg_val = ((p_input->y_len << HWIO_JPEG_WE_Y_PING_BUFFER_CFG_WE_BUFFER_LENGTH_SHFT) & HWIO_JPEG_WE_Y_PING_BUFFER_CFG_WE_BUFFER_LENGTH_BMSK); hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); n_reg_val = p_input->y_buffer_addr; hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); } else if (pingpong_index == 1) { hw_cmd_p = &hw_cmd_we_pong_update[0]; n_reg_val = ((p_input->y_len << HWIO_JPEG_WE_Y_PONG_BUFFER_CFG_WE_BUFFER_LENGTH_SHFT) & HWIO_JPEG_WE_Y_PONG_BUFFER_CFG_WE_BUFFER_LENGTH_BMSK); hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); n_reg_val = p_input->y_buffer_addr; hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); } else { } return; }
void msm_gemini_hw_we_buffer_update(struct msm_gemini_hw_buf *p_input, uint8_t pingpong_index) { uint32_t n_reg_val = 0; struct msm_gemini_hw_cmd *hw_cmd_p; if (pingpong_index == 0) { hw_cmd_p = &hw_cmd_we_ping_update[0]; n_reg_val = ((p_input->y_len << HWIO_JPEG_WE_Y_PING_BUFFER_CFG_WE_BUFFER_LENGTH_SHFT) & HWIO_JPEG_WE_Y_PING_BUFFER_CFG_WE_BUFFER_LENGTH_BMSK); hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); n_reg_val = p_input->y_buffer_addr; hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); } else if (pingpong_index == 1) { hw_cmd_p = &hw_cmd_we_pong_update[0]; n_reg_val = ((p_input->y_len << HWIO_JPEG_WE_Y_PONG_BUFFER_CFG_WE_BUFFER_LENGTH_SHFT) & HWIO_JPEG_WE_Y_PONG_BUFFER_CFG_WE_BUFFER_LENGTH_BMSK); hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); n_reg_val = p_input->y_buffer_addr; hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); } else { /* shall not get to here */ } return; }
void msm_gemini_hw_fe_start(void) { msm_gemini_hw_write(&hw_cmd_fe_start[0]); return; }
void msm_gemini_hw_fe_buffer_update(struct msm_gemini_hw_buf *p_input, uint8_t pingpong_index) { uint32_t n_reg_val = 0; struct msm_gemini_hw_cmd *hw_cmd_p; if (pingpong_index == 0) { hw_cmd_p = &hw_cmd_fe_ping_update[0]; n_reg_val = ((((p_input->num_of_mcu_rows - 1) << HWIO_JPEG_FE_BUFFER_CFG_CBCR_MCU_ROWS_SHFT) & HWIO_JPEG_FE_BUFFER_CFG_CBCR_MCU_ROWS_BMSK) | (((p_input->num_of_mcu_rows - 1) << HWIO_JPEG_FE_BUFFER_CFG_Y_MCU_ROWS_SHFT) & HWIO_JPEG_FE_BUFFER_CFG_Y_MCU_ROWS_BMSK)); hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); n_reg_val = ((p_input->y_buffer_addr << HWIO_JPEG_FE_Y_PING_ADDR_FE_Y_PING_START_ADDR_SHFT) & HWIO_JPEG_FE_Y_PING_ADDR_FE_Y_PING_START_ADDR_BMSK); hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); n_reg_val = ((p_input->cbcr_buffer_addr<< HWIO_JPEG_FE_CBCR_PING_ADDR_FE_CBCR_PING_START_ADDR_SHFT) & HWIO_JPEG_FE_CBCR_PING_ADDR_FE_CBCR_PING_START_ADDR_BMSK); hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); msm_gemini_hw_write(hw_cmd_p); } else if (pingpong_index == 1) { hw_cmd_p = &hw_cmd_fe_pong_update[0]; n_reg_val = ((((p_input->num_of_mcu_rows - 1) << HWIO_JPEG_FE_BUFFER_CFG_CBCR_MCU_ROWS_SHFT) & HWIO_JPEG_FE_BUFFER_CFG_CBCR_MCU_ROWS_BMSK) | (((p_input->num_of_mcu_rows - 1) << HWIO_JPEG_FE_BUFFER_CFG_Y_MCU_ROWS_SHFT) & HWIO_JPEG_FE_BUFFER_CFG_Y_MCU_ROWS_BMSK)); hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); n_reg_val = ((p_input->y_buffer_addr << HWIO_JPEG_FE_Y_PONG_ADDR_FE_Y_PONG_START_ADDR_SHFT) & HWIO_JPEG_FE_Y_PONG_ADDR_FE_Y_PONG_START_ADDR_BMSK); hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); n_reg_val = ((p_input->cbcr_buffer_addr<< HWIO_JPEG_FE_CBCR_PONG_ADDR_FE_CBCR_PONG_START_ADDR_SHFT) & HWIO_JPEG_FE_CBCR_PONG_ADDR_FE_CBCR_PONG_START_ADDR_BMSK); hw_cmd_p->data = n_reg_val; msm_gemini_hw_write(hw_cmd_p++); msm_gemini_hw_write(hw_cmd_p); } else { /* shall not get to here */ } return; }