diff options
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 7 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_hwio.h | 3 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 52 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_pipe.c | 84 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_pp.c | 71 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_util.c | 2 |
6 files changed, 184 insertions, 35 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index c45a76ae9942..79ffd681c24f 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -347,9 +347,6 @@ struct mdss_mdp_pipe { u8 vert_deci; struct mdss_mdp_img_rect src; struct mdss_mdp_img_rect dst; - u32 phase_step_x; - u32 phase_step_y; - struct mdss_mdp_format_params *src_fmt; struct mdss_mdp_plane_sizes src_planes; @@ -376,6 +373,9 @@ struct mdss_mdp_pipe { struct mdp_overlay_pp_params pp_cfg; struct mdss_pipe_pp_res pp_res; + struct mdp_scale_data scale; + u8 chroma_sample_h; + u8 chroma_sample_v; }; struct mdss_mdp_writeback_arg { @@ -663,6 +663,7 @@ int mdss_mdp_wb_set_format(struct msm_fb_data_type *mfd, u32 dst_format); int mdss_mdp_wb_get_format(struct msm_fb_data_type *mfd, struct mdp_mixer_cfg *mixer_cfg); +int mdss_mdp_pipe_program_pixel_extn(struct mdss_mdp_pipe *pipe); #define mfd_to_mdp5_data(mfd) (mfd->mdp.private1) #define mfd_to_mdata(mfd) (((struct mdss_overlay_private *)\ (mfd->mdp.private1))->mdata) diff --git a/drivers/video/fbdev/msm/mdss_mdp_hwio.h b/drivers/video/fbdev/msm/mdss_mdp_hwio.h index 753f072a57c3..aad7954d002b 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_hwio.h +++ b/drivers/video/fbdev/msm/mdss_mdp_hwio.h @@ -205,6 +205,9 @@ enum mdss_mdp_sspp_chroma_samp_type { #define MDSS_MDP_REG_SSPP_CURRENT_SRC2_ADDR 0x0AC #define MDSS_MDP_REG_SSPP_CURRENT_SRC3_ADDR 0x0B0 #define MDSS_MDP_REG_SSPP_DECIMATION_CONFIG 0x0B4 +#define MDSS_MDP_REG_SSPP_SW_PIX_EXT_C0_LR 0x100 +#define MDSS_MDP_REG_SSPP_SW_PIX_EXT_C0_TB 0x104 +#define MDSS_MDP_REG_SSPP_SW_PIX_EXT_C0_REQ_PIXELS 0x108 #define MDSS_MDP_REG_VIG_OP_MODE 0x200 #define MDSS_MDP_REG_VIG_QSEED2_CONFIG 0x204 diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index 5a9138a246c7..08d183319fc1 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -281,7 +281,12 @@ static int __mdss_mdp_overlay_setup_scaling(struct mdss_mdp_pipe *pipe) int rc; src = pipe->src.w >> pipe->horz_deci; - rc = mdss_mdp_calc_phase_step(src, pipe->dst.w, &pipe->phase_step_x); + + if (pipe->scale.enable_pxl_ext) + return 0; + memset(&pipe->scale, 0, sizeof(struct mdp_scale_data)); + rc = mdss_mdp_calc_phase_step(src, pipe->dst.w, + &pipe->scale.phase_step_x[0]); if (rc) { pr_err("Horizontal scaling calculation failed=%d! %d->%d\n", rc, src, pipe->dst.w); @@ -289,16 +294,43 @@ static int __mdss_mdp_overlay_setup_scaling(struct mdss_mdp_pipe *pipe) } src = pipe->src.h >> pipe->vert_deci; - rc = mdss_mdp_calc_phase_step(src, pipe->dst.h, &pipe->phase_step_y); + rc = mdss_mdp_calc_phase_step(src, pipe->dst.h, + &pipe->scale.phase_step_y[0]); if (rc) { pr_err("Vertical scaling calculation failed=%d! %d->%d\n", rc, src, pipe->dst.h); return rc; } - + pipe->scale.init_phase_x[0] = (pipe->scale.phase_step_x[0] - + (1 << PHASE_STEP_SHIFT)) / 2; + pipe->scale.init_phase_y[0] = (pipe->scale.phase_step_y[0] - + (1 << PHASE_STEP_SHIFT)) / 2; return 0; } +static inline void __mdss_mdp_overlay_set_chroma_sample( + struct mdss_mdp_pipe *pipe) +{ + pipe->chroma_sample_v = pipe->chroma_sample_h = 0; + + switch (pipe->src_fmt->chroma_sample) { + case MDSS_MDP_CHROMA_H1V2: + pipe->chroma_sample_v = 1; + break; + case MDSS_MDP_CHROMA_H2V1: + pipe->chroma_sample_h = 1; + break; + case MDSS_MDP_CHROMA_420: + pipe->chroma_sample_v = 1; + pipe->chroma_sample_h = 1; + break; + } + if (pipe->horz_deci) + pipe->chroma_sample_h = 0; + if (pipe->vert_deci) + pipe->chroma_sample_v = 0; +} + static int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, struct mdp_overlay *req, struct mdss_mdp_pipe **ppipe) @@ -449,7 +481,10 @@ static int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, pipe->dst.h = req->dst_rect.h; pipe->horz_deci = req->horz_deci; pipe->vert_deci = req->vert_deci; + + memcpy(&pipe->scale, &req->scale, sizeof(struct mdp_scale_data)); pipe->src_fmt = fmt; + __mdss_mdp_overlay_set_chroma_sample(pipe); pipe->mixer_stage = req->z_order; pipe->is_fg = req->is_fg; @@ -465,7 +500,8 @@ static int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, pr_debug("Unintended blend_op %d on layer with no alpha plane\n", pipe->blend_op); - if (fmt->is_yuv && !(pipe->flags & MDP_SOURCE_ROTATED_90)) { + if (fmt->is_yuv && !(pipe->flags & MDP_SOURCE_ROTATED_90) && + !pipe->scale.enable_pxl_ext) { pipe->overfetch_disable = OVERFETCH_DISABLE_BOTTOM; if (!(pipe->flags & MDSS_MDP_DUAL_PIPE) || @@ -531,7 +567,7 @@ static int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, } } - if (pipe->flags & MDP_DEINTERLACE) { + if ((pipe->flags & MDP_DEINTERLACE) && !pipe->scale.enable_pxl_ext) { if (pipe->flags & MDP_SOURCE_ROTATED_90) { pipe->src.x = DIV_ROUND_UP(pipe->src.x, 2); pipe->src.w /= 2; @@ -556,6 +592,12 @@ static int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, !mdp5_data->mdata->has_wfd_blk) mdss_mdp_smp_release(pipe); + /* + * Clear previous SMP reservations and reserve according to the + * latest configuration + */ + mdss_mdp_smp_unreserve(pipe); + ret = mdss_mdp_smp_reserve(pipe); if (ret) { pr_debug("mdss_mdp_smp_reserve failed. ret=%d\n", ret); diff --git a/drivers/video/fbdev/msm/mdss_mdp_pipe.c b/drivers/video/fbdev/msm/mdss_mdp_pipe.c index 2ec25962db71..5ae166568c72 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_pipe.c +++ b/drivers/video/fbdev/msm/mdss_mdp_pipe.c @@ -586,6 +586,8 @@ static int mdss_mdp_pipe_free(struct mdss_mdp_pipe *pipe) mdss_mdp_smp_free(pipe); pipe->flags = 0; pipe->bwc_mode = 0; + memset(&pipe->scale, 0, sizeof(struct mdp_scale_data)); + mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF, false); return 0; @@ -748,7 +750,11 @@ static int mdss_mdp_image_setup(struct mdss_mdp_pipe *pipe, ystride1 = (pipe->src_planes.ystride[2]) | (pipe->src_planes.ystride[3] << 16); - if (pipe->overfetch_disable) { + /* + * Software overfetch is used when scalar pixel extension is + * not enabled + */ + if (pipe->overfetch_disable && !pipe->scale.enable_pxl_ext) { if (pipe->overfetch_disable & OVERFETCH_DISABLE_BOTTOM) { height = pipe->src.h; if (!(pipe->overfetch_disable & OVERFETCH_DISABLE_TOP)) @@ -857,6 +863,8 @@ static int mdss_mdp_format_setup(struct mdss_mdp_pipe *pipe) MDSS_MDP_FETCH_CONFIG_RESET_VALUE | mdata->highest_bank_bit << 18); } + if (pipe->scale.enable_pxl_ext) + opmode |= (1 << 31); mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC_FORMAT, src_format); mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC_UNPACK_PATTERN, unpack); mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC_OP_MODE, opmode); @@ -888,20 +896,21 @@ int mdss_mdp_pipe_addr_setup(struct mdss_data_type *mdata, } static int mdss_mdp_src_addr_setup(struct mdss_mdp_pipe *pipe, - struct mdss_mdp_data *data) + struct mdss_mdp_data *src_data) { struct mdss_data_type *mdata = mdss_mdp_get_mdata(); + struct mdss_mdp_data data = *src_data; int ret = 0; pr_debug("pnum=%d\n", pipe->num); - data->bwc_enabled = pipe->bwc_mode; + data.bwc_enabled = pipe->bwc_mode; - ret = mdss_mdp_data_check(data, &pipe->src_planes); + ret = mdss_mdp_data_check(&data, &pipe->src_planes); if (ret) return ret; - if (pipe->overfetch_disable) { + if (pipe->overfetch_disable && !pipe->scale.enable_pxl_ext) { u32 x = 0, y = 0; if (pipe->overfetch_disable & OVERFETCH_DISABLE_LEFT) @@ -909,7 +918,7 @@ static int mdss_mdp_src_addr_setup(struct mdss_mdp_pipe *pipe, if (pipe->overfetch_disable & OVERFETCH_DISABLE_TOP) y = pipe->src.y; - mdss_mdp_data_calc_offset(data, x, y, + mdss_mdp_data_calc_offset(&data, x, y, &pipe->src_planes, pipe->src_fmt); } @@ -917,12 +926,12 @@ static int mdss_mdp_src_addr_setup(struct mdss_mdp_pipe *pipe, if (mdata->mdp_rev < MDSS_MDP_HW_REV_102 && (pipe->src_fmt->fetch_planes == MDSS_MDP_PLANE_PLANAR) && (pipe->src_fmt->element[0] == C1_B_Cb)) - swap(data->p[1].addr, data->p[2].addr); + swap(data.p[1].addr, data.p[2].addr); - mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC0_ADDR, data->p[0].addr); - mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC1_ADDR, data->p[1].addr); - mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC2_ADDR, data->p[2].addr); - mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC3_ADDR, data->p[3].addr); + mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC0_ADDR, data.p[0].addr); + mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC1_ADDR, data.p[1].addr); + mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC2_ADDR, data.p[2].addr); + mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC3_ADDR, data.p[3].addr); return 0; } @@ -953,8 +962,9 @@ int mdss_mdp_pipe_queue_data(struct mdss_mdp_pipe *pipe, struct mdss_mdp_data *src_data) { int ret = 0; - u32 params_changed, opmode; struct mdss_mdp_ctl *ctl; + u32 params_changed; + u32 opmode = 0; if (!pipe) { pr_err("pipe not setup properly for queue\n"); @@ -1035,3 +1045,53 @@ int mdss_mdp_pipe_is_staged(struct mdss_mdp_pipe *pipe) { return (pipe == pipe->mixer->stage_pipe[pipe->mixer_stage]); } + +static inline void __mdss_mdp_pipe_program_pixel_extn_helper( + struct mdss_mdp_pipe *pipe, u32 plane, u32 off) +{ + u32 src_h = pipe->src.h >> pipe->vert_deci; + u32 mask = 0xFF; + + /* + * CB CR plane required pxls need to be accounted + * for chroma decimation. + */ + if (plane == 1) + src_h >>= pipe->chroma_sample_v; + writel_relaxed(((pipe->scale.right_ftch[plane] & mask) << 24)| + ((pipe->scale.right_rpt[plane] & mask) << 16)| + ((pipe->scale.left_ftch[plane] & mask) << 8)| + (pipe->scale.left_rpt[plane] & mask), pipe->base + + MDSS_MDP_REG_SSPP_SW_PIX_EXT_C0_LR + off); + writel_relaxed(((pipe->scale.btm_ftch[plane] & mask) << 24)| + ((pipe->scale.btm_rpt[plane] & mask) << 16)| + ((pipe->scale.top_ftch[plane] & mask) << 8)| + (pipe->scale.top_rpt[plane] & mask), pipe->base + + MDSS_MDP_REG_SSPP_SW_PIX_EXT_C0_TB + off); + mask = 0xFFFF; + writel_relaxed((((src_h + pipe->scale.num_ext_pxls_top[plane] + + pipe->scale.num_ext_pxls_btm[plane]) & mask) << 16) | + ((pipe->scale.roi_w[plane] + + pipe->scale.num_ext_pxls_left[plane] + + pipe->scale.num_ext_pxls_right[plane]) & mask), pipe->base + + MDSS_MDP_REG_SSPP_SW_PIX_EXT_C0_REQ_PIXELS + off); +} + +/** + * mdss_mdp_pipe_program_pixel_extn - Program the source pipe's + * sw pixel extension + * @pipe: Source pipe struct containing pixel extn values + * + * Function programs the pixel extn values calculated during + * scale setup. + */ +int mdss_mdp_pipe_program_pixel_extn(struct mdss_mdp_pipe *pipe) +{ + /* Y plane pixel extn */ + __mdss_mdp_pipe_program_pixel_extn_helper(pipe, 0, 0); + /* CB CR plane pixel extn */ + __mdss_mdp_pipe_program_pixel_extn_helper(pipe, 1, 16); + /* Alpha plane pixel extn */ + __mdss_mdp_pipe_program_pixel_extn_helper(pipe, 3, 32); + return 0; +} diff --git a/drivers/video/fbdev/msm/mdss_mdp_pp.c b/drivers/video/fbdev/msm/mdss_mdp_pp.c index 262a114e2a1f..73b97736a920 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_pp.c +++ b/drivers/video/fbdev/msm/mdss_mdp_pp.c @@ -848,7 +848,7 @@ static int pp_vig_pipe_setup(struct mdss_mdp_pipe *pipe, u32 *op) } } - *op = opmode; + *op |= opmode; return 0; } @@ -879,12 +879,15 @@ static void pp_update_pa_v2_vig_opmode(struct pp_sts_type *pp_sts, static int mdss_mdp_scale_setup(struct mdss_mdp_pipe *pipe) { u32 scale_config = 0; - u32 phasex_step = 0, phasey_step = 0; + int init_phasex = 0, init_phasey = 0; + int phasex_step = 0, phasey_step = 0; u32 chroma_sample; u32 filter_mode; struct mdss_data_type *mdata; u32 src_w, src_h; + pr_debug("pipe=%d, change pxl ext=%d\n", pipe->num, + pipe->scale.enable_pxl_ext); mdata = mdss_mdp_get_mdata(); if (mdata->mdp_rev >= MDSS_MDP_HW_REV_102 && pipe->src_fmt->is_yuv) filter_mode = MDSS_MDP_SCALE_FILTER_CA; @@ -931,7 +934,8 @@ static int mdss_mdp_scale_setup(struct mdss_mdp_pipe *pipe) if ((src_h != pipe->dst.h) || (pipe->pp_res.pp_sts.sharp_sts & PP_STS_ENABLE) || (chroma_sample == MDSS_MDP_CHROMA_420) || - (chroma_sample == MDSS_MDP_CHROMA_H1V2)) { + (chroma_sample == MDSS_MDP_CHROMA_H1V2) || + pipe->scale.enable_pxl_ext) { pr_debug("scale y - src_h=%d dst_h=%d\n", src_h, pipe->dst.h); if ((src_h / MAX_DOWNSCALE_RATIO) > pipe->dst.h) { @@ -941,7 +945,8 @@ static int mdss_mdp_scale_setup(struct mdss_mdp_pipe *pipe) } scale_config |= MDSS_MDP_SCALEY_EN; - phasey_step = pipe->phase_step_y; + phasey_step = pipe->scale.phase_step_y[0]; + init_phasey = pipe->scale.init_phase_y[0]; if (pipe->type == MDSS_MDP_PIPE_TYPE_VIG) { u32 chroma_shift = 0; @@ -950,11 +955,11 @@ static int mdss_mdp_scale_setup(struct mdss_mdp_pipe *pipe) (chroma_sample == MDSS_MDP_CHROMA_H1V2))) chroma_shift = 1; /* 2x upsample chroma */ - if (src_h <= pipe->dst.h) { + if (src_h <= pipe->dst.h) scale_config |= /* G/Y, A */ (filter_mode << 10) | (MDSS_MDP_SCALE_FILTER_BIL << 18); - } else + else scale_config |= /* G/Y, A */ (MDSS_MDP_SCALE_FILTER_PCMN << 10) | (MDSS_MDP_SCALE_FILTER_PCMN << 18); @@ -966,6 +971,8 @@ static int mdss_mdp_scale_setup(struct mdss_mdp_pipe *pipe) scale_config |= /* CrCb */ (MDSS_MDP_SCALE_FILTER_PCMN << 14); + writel_relaxed(init_phasey, pipe->base + + MDSS_MDP_REG_VIG_QSEED2_C12_INIT_PHASEY); writel_relaxed(phasey_step >> chroma_shift, pipe->base + MDSS_MDP_REG_VIG_QSEED2_C12_PHASESTEPY); } else { @@ -983,7 +990,8 @@ static int mdss_mdp_scale_setup(struct mdss_mdp_pipe *pipe) if ((src_w != pipe->dst.w) || (pipe->pp_res.pp_sts.sharp_sts & PP_STS_ENABLE) || (chroma_sample == MDSS_MDP_CHROMA_420) || - (chroma_sample == MDSS_MDP_CHROMA_H2V1)) { + (chroma_sample == MDSS_MDP_CHROMA_H2V1) || + pipe->scale.enable_pxl_ext) { pr_debug("scale x - src_w=%d dst_w=%d\n", src_w, pipe->dst.w); if ((src_w / MAX_DOWNSCALE_RATIO) > pipe->dst.w) { @@ -993,7 +1001,8 @@ static int mdss_mdp_scale_setup(struct mdss_mdp_pipe *pipe) } scale_config |= MDSS_MDP_SCALEX_EN; - phasex_step = pipe->phase_step_x; + init_phasex = pipe->scale.init_phase_x[0]; + phasex_step = pipe->scale.phase_step_x[0]; if (pipe->type == MDSS_MDP_PIPE_TYPE_VIG) { u32 chroma_shift = 0; @@ -1003,11 +1012,11 @@ static int mdss_mdp_scale_setup(struct mdss_mdp_pipe *pipe) (chroma_sample == MDSS_MDP_CHROMA_H2V1))) chroma_shift = 1; /* 2x upsample chroma */ - if (src_w <= pipe->dst.w) { + if (src_w <= pipe->dst.w) scale_config |= /* G/Y, A */ (filter_mode << 8) | (MDSS_MDP_SCALE_FILTER_BIL << 16); - } else + else scale_config |= /* G/Y, A */ (MDSS_MDP_SCALE_FILTER_PCMN << 8) | (MDSS_MDP_SCALE_FILTER_PCMN << 16); @@ -1019,6 +1028,8 @@ static int mdss_mdp_scale_setup(struct mdss_mdp_pipe *pipe) scale_config |= /* CrCb */ (MDSS_MDP_SCALE_FILTER_PCMN << 12); + writel_relaxed(init_phasex, pipe->base + + MDSS_MDP_REG_VIG_QSEED2_C12_INIT_PHASEX); writel_relaxed(phasex_step >> chroma_shift, pipe->base + MDSS_MDP_REG_VIG_QSEED2_C12_PHASESTEPX); } else { @@ -1033,12 +1044,44 @@ static int mdss_mdp_scale_setup(struct mdss_mdp_pipe *pipe) } } + if (pipe->scale.enable_pxl_ext && + pipe->type == MDSS_MDP_PIPE_TYPE_VIG) { + + /*program x,y initial phase and phase step*/ + writel_relaxed(pipe->scale.init_phase_x[0], + pipe->base + MDSS_MDP_REG_VIG_QSEED2_C03_INIT_PHASEX); + writel_relaxed(pipe->scale.phase_step_x[0], + pipe->base + MDSS_MDP_REG_VIG_QSEED2_C03_PHASESTEPX); + writel_relaxed(pipe->scale.init_phase_x[1], + pipe->base + MDSS_MDP_REG_VIG_QSEED2_C12_INIT_PHASEX); + writel_relaxed(pipe->scale.phase_step_x[1], + pipe->base + MDSS_MDP_REG_VIG_QSEED2_C12_PHASESTEPX); + + writel_relaxed(pipe->scale.init_phase_y[0], + pipe->base + MDSS_MDP_REG_VIG_QSEED2_C03_INIT_PHASEY); + writel_relaxed(pipe->scale.phase_step_y[0], + pipe->base + MDSS_MDP_REG_VIG_QSEED2_C03_PHASESTEPY); + writel_relaxed(pipe->scale.init_phase_y[1], + pipe->base + MDSS_MDP_REG_VIG_QSEED2_C12_INIT_PHASEY); + writel_relaxed(pipe->scale.phase_step_y[1], + pipe->base + MDSS_MDP_REG_VIG_QSEED2_C12_PHASESTEPY); + + /*program pixel extn values for the SSPP*/ + mdss_mdp_pipe_program_pixel_extn(pipe); + } else { + writel_relaxed(phasex_step, pipe->base + + MDSS_MDP_REG_SCALE_PHASE_STEP_X); + writel_relaxed(phasey_step, pipe->base + + MDSS_MDP_REG_SCALE_PHASE_STEP_Y); + writel_relaxed(init_phasex, pipe->base + + MDSS_MDP_REG_SCALE_INIT_PHASE_X); + writel_relaxed(init_phasey, pipe->base + + MDSS_MDP_REG_SCALE_INIT_PHASE_Y); + } + writel_relaxed(scale_config, pipe->base + MDSS_MDP_REG_SCALE_CONFIG); - writel_relaxed(phasex_step, pipe->base + - MDSS_MDP_REG_SCALE_PHASE_STEP_X); - writel_relaxed(phasey_step, pipe->base + - MDSS_MDP_REG_SCALE_PHASE_STEP_Y); + return 0; } diff --git a/drivers/video/fbdev/msm/mdss_mdp_util.c b/drivers/video/fbdev/msm/mdss_mdp_util.c index d39595d96b39..2a8ea3b135d4 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_util.c +++ b/drivers/video/fbdev/msm/mdss_mdp_util.c @@ -601,7 +601,7 @@ int mdss_mdp_calc_phase_step(u32 src, u32 dst, u32 *out_phase) return -EINVAL; unit = 1 << PHASE_STEP_SHIFT; - *out_phase = mult_frac(src, unit, dst); + *out_phase = mult_frac(unit, src, dst); /* check if overflow is possible */ if (src > dst) { |
