Merge "msm: camera: cdm: Clear IRQ before reading userdata" into camera-kernel.lnx.4.0

Dieser Commit ist enthalten in:
Camera Software Integration
2020-02-04 15:18:14 -08:00
committet von Gerrit - the friendly Code Review server
Commit 933a941f33
2 geänderte Dateien mit 34 neuen und 31 gelöschten Zeilen

Datei anzeigen

@@ -1108,19 +1108,25 @@ irqreturn_t cam_hw_cdm_irq(int irq_num, void *data)
for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo_irq; i++) {
if (cam_cdm_read_hw_reg(cdm_hw,
cdm_core->offsets->irq_reg[i]->irq_status,
&irq_status[i])) {
cdm_core->offsets->irq_reg[i]->irq_status,
&irq_status[i])) {
CAM_ERR(CAM_CDM, "Failed to read CDM HW IRQ status");
}
if (cam_cdm_write_hw_reg(cdm_hw,
cdm_core->offsets->irq_reg[i]->irq_clear,
irq_status[i])) {
CAM_ERR(CAM_CDM,
"Failed to Write CDM HW IRQ Clear");
}
}
if (cam_cdm_write_hw_reg(cdm_hw,
cdm_core->offsets->irq_reg[0]->irq_clear_cmd, 0x01))
CAM_ERR(CAM_CDM, "Failed to Write CDM HW IRQ cmd 0");
for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo_irq; i++) {
if (!irq_status[i]) {
cam_cdm_write_hw_reg(cdm_hw,
cdm_core->offsets->irq_reg[i]->irq_clear,
irq_status[i]);
if (!irq_status[i])
continue;
}
payload[i] = kzalloc(sizeof(struct cam_cdm_work_payload),
GFP_ATOMIC);
@@ -1128,11 +1134,10 @@ irqreturn_t cam_hw_cdm_irq(int irq_num, void *data)
if (!payload[i])
continue;
if (irq_status[i] &
CAM_CDM_IRQ_STATUS_INLINE_IRQ_MASK) {
if (irq_status[i] & CAM_CDM_IRQ_STATUS_INLINE_IRQ_MASK) {
if (cam_cdm_read_hw_reg(cdm_hw,
cdm_core->offsets->cmn_reg->usr_data,
&user_data)) {
cdm_core->offsets->cmn_reg->usr_data,
&user_data)) {
CAM_ERR(CAM_CDM,
"Failed to read CDM HW IRQ data");
kfree(payload[i]);
@@ -1142,9 +1147,8 @@ irqreturn_t cam_hw_cdm_irq(int irq_num, void *data)
payload[i]->irq_data = user_data >> (i * 0x8);
if (payload[i]->irq_data ==
CAM_CDM_DBG_GEN_IRQ_USR_DATA)
CAM_INFO(CAM_CDM,
"Debug gen_irq received");
CAM_CDM_DBG_GEN_IRQ_USR_DATA)
CAM_INFO(CAM_CDM, "Debug gen_irq received");
}
payload[i]->fifo_idx = i;
@@ -1154,18 +1158,9 @@ irqreturn_t cam_hw_cdm_irq(int irq_num, void *data)
INIT_WORK((struct work_struct *)&payload[i]->work,
cam_hw_cdm_work);
if (cam_cdm_write_hw_reg(cdm_hw,
cdm_core->offsets->irq_reg[i]->irq_clear,
payload[i]->irq_status)) {
CAM_ERR(CAM_CDM,
"Failed to Write CDM HW IRQ Clear");
kfree(payload[i]);
return IRQ_HANDLED;
}
work_status = queue_work(
cdm_core->bl_fifo[i].work_queue,
&payload[i]->work);
cdm_core->bl_fifo[i].work_queue,
&payload[i]->work);
if (work_status == false) {
CAM_ERR(CAM_CDM,
@@ -1175,11 +1170,6 @@ irqreturn_t cam_hw_cdm_irq(int irq_num, void *data)
}
}
if (cam_cdm_write_hw_reg(cdm_hw,
cdm_core->offsets->irq_reg[0]->irq_clear_cmd,
0x01))
CAM_ERR(CAM_CDM, "Failed to Write CDM HW IRQ cmd 0");
return IRQ_HANDLED;
}

Datei anzeigen

@@ -3711,7 +3711,20 @@ static int cam_ife_mgr_stop_hw(void *hw_mgr_priv, void *stop_hw_args)
cam_ife_mgr_pause_hw(ctx);
wait_for_completion(&ctx->config_done_complete);
rc = wait_for_completion_timeout(
&ctx->config_done_complete,
msecs_to_jiffies(300));
if (rc <= 0) {
CAM_WARN(CAM_ISP,
"config done completion timeout for last applied req_id=%llu rc=%d ctx_index %d",
ctx->applied_req_id, rc, ctx->ctx_index);
rc = -ETIMEDOUT;
} else {
CAM_DBG(CAM_ISP,
"config done Success for req_id=%llu ctx_index %d",
ctx->applied_req_id, ctx->ctx_index);
rc = 0;
}
if (stop_isp->stop_only)
goto end;