From 3990c6a17a0049c0b3a95b14bb48b1804b5aecf9 Mon Sep 17 00:00:00 2001 From: Benjamin Chan Date: Thu, 18 Aug 2016 23:55:21 -0400 Subject: [PATCH] msm: sde: Fix SDE rotator driver error handling Initialize some local variables before using them and safely return an error code when encounter error cases in the SDE rotator driver. CRs-Fixed: 1060558 Change-Id: I25406b13ac2007f1789d8d32e428c39dac4c29cf Signed-off-by: Benjamin Chan --- .../media/platform/msm/sde/rotator/sde_rotator_r1_wb.c | 2 +- drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c | 9 ++++++--- .../media/platform/msm/sde/rotator/sde_rotator_util.c | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_r1_wb.c b/drivers/media/platform/msm/sde/rotator/sde_rotator_r1_wb.c index 2cf22ae6a3ed..e0f44be222d6 100644 --- a/drivers/media/platform/msm/sde/rotator/sde_rotator_r1_wb.c +++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_r1_wb.c @@ -316,7 +316,7 @@ static int sde_mdp_wb_wait4comp(struct sde_mdp_ctl *ctl, void *arg) { struct sde_mdp_writeback_ctx *ctx; int rc = 0; - u64 rot_time; + u64 rot_time = 0; u32 status, mask, isr; ctx = (struct sde_mdp_writeback_ctx *) ctl->priv_data; diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c index 9b08c4fe0989..13d593c46824 100644 --- a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c +++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c @@ -1566,8 +1566,8 @@ static int sde_hw_rotator_kickoff(struct sde_rot_hw_resource *hw, if (!ctx) { SDEROT_ERR("Cannot locate rotator ctx from sesison id:%d\n", entry->item.session_id); + return -EINVAL; } - WARN_ON(ctx == NULL); ret = sde_smmu_ctrl(1); if (IS_ERR_VALUE(ret)) { @@ -1609,8 +1609,8 @@ static int sde_hw_rotator_wait4done(struct sde_rot_hw_resource *hw, if (!ctx) { SDEROT_ERR("Cannot locate rotator ctx from sesison id:%d\n", entry->item.session_id); + return -EINVAL; } - WARN_ON(ctx == NULL); ret = rot->ops.wait_rotator_done(ctx, ctx->q_id, 0); @@ -1745,8 +1745,10 @@ static irqreturn_t sde_hw_rotator_regdmairq_handler(int irq, void *ptr) q_id = ROT_QUEUE_LOW_PRIORITY; ts = (ts >> SDE_REGDMA_SWTS_SHIFT) & SDE_REGDMA_SWTS_MASK; + } else { + SDEROT_ERR("unknown ISR status: isr=0x%X\n", isr); + goto done_isr_handle; } - ctx = rot->rotCtx[q_id][ts & SDE_HW_ROT_REGDMA_SEG_MASK]; /* @@ -1766,6 +1768,7 @@ static irqreturn_t sde_hw_rotator_regdmairq_handler(int irq, void *ptr) [ts & SDE_HW_ROT_REGDMA_SEG_MASK]; }; +done_isr_handle: spin_unlock(&rot->rotisr_lock); ret = IRQ_HANDLED; } else if (isr & REGDMA_INT_ERR_MASK) { diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_util.c b/drivers/media/platform/msm/sde/rotator/sde_rotator_util.c index 44f7af089ee9..eed177ea5bab 100644 --- a/drivers/media/platform/msm/sde/rotator/sde_rotator_util.c +++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_util.c @@ -586,7 +586,7 @@ void sde_rot_ubwc_data_calc_offset(struct sde_mdp_data *data, u16 x, u16 y, struct sde_mdp_plane_sizes *ps, struct sde_mdp_format_params *fmt) { u16 macro_w, micro_w, micro_h; - u32 offset; + u32 offset = 0; int ret; ret = sde_rot_get_ubwc_micro_dim(fmt->format, µ_w, µ_h);