diff options
author | Jason Chen <b02280@freescale.com> | 2011-07-13 12:18:56 +0800 |
---|---|---|
committer | Jason Liu <r64343@freescale.com> | 2012-01-09 20:18:43 +0800 |
commit | 82663ebdc921ed2a41920300ba9b0a99ad4747d8 (patch) | |
tree | bb2f8354f66710560033746c53eb46db06124220 /drivers/media | |
parent | f573bb1160b4cf1ecf72c8cce02ea001c7a3ed5a (diff) |
ENGR00152845-9 v4l2 output: changes based on ipu changes.
v4l2 output changes based on ipu change.
Signed-off-by: Jason Chen <jason.chen@freescale.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/mxc/output/mxc_v4l2_output.c | 177 | ||||
-rw-r--r-- | drivers/media/video/mxc/output/mxc_v4l2_output.h | 1 |
2 files changed, 91 insertions, 87 deletions
diff --git a/drivers/media/video/mxc/output/mxc_v4l2_output.c b/drivers/media/video/mxc/output/mxc_v4l2_output.c index 565dd96cd339..49e538e8c463 100644 --- a/drivers/media/video/mxc/output/mxc_v4l2_output.c +++ b/drivers/media/video/mxc/output/mxc_v4l2_output.c @@ -249,9 +249,9 @@ static int select_display_buffer(vout_data *vout, int next_buf) int ret = 0; vout->disp_buf_num = next_buf; - if (ipu_get_cur_buffer_idx(vout->display_ch, IPU_INPUT_BUFFER) + if (ipu_get_cur_buffer_idx(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER) != next_buf) - ret = ipu_select_buffer(vout->display_ch, IPU_INPUT_BUFFER, + ret = ipu_select_buffer(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER, next_buf); else dev_dbg(&vout->video_dev->dev, @@ -294,7 +294,7 @@ static int finish_previous_frame(vout_data *vout) int ret = 0, try = 0; /* make sure buf[vout->disp_buf_num] in showing */ - while (ipu_check_buffer_ready(vout->display_ch, + while (ipu_check_buffer_ready(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER, vout->disp_buf_num)) { if (fbi->fbops->fb_ioctl) { old_fs = get_fs(); @@ -309,7 +309,7 @@ static int finish_previous_frame(vout_data *vout) * when fb doing blank and unblank, it has chance to go into * dead loop: fb unblank just after buffer 1 ready selected. */ - ipu_clear_buffer_ready(vout->display_ch, IPU_INPUT_BUFFER, + ipu_clear_buffer_ready(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER, vout->disp_buf_num); } } @@ -327,7 +327,7 @@ static int show_current_frame(vout_data *vout) int ret = 0; /* make sure buf[vout->disp_buf_num] begin to show */ - if (ipu_get_cur_buffer_idx(vout->display_ch, IPU_INPUT_BUFFER) + if (ipu_get_cur_buffer_idx(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER) != vout->disp_buf_num) { /* wait for display frame finish */ if (fbi->fbops->fb_ioctl) { @@ -364,7 +364,7 @@ static void icbypass_work_func(struct work_struct *work) vout->frame_count++; vout->ipu_buf[vout->next_rdy_ipu_buf] = index; - ret = ipu_update_channel_buffer(vout->display_ch, IPU_INPUT_BUFFER, + ret = ipu_update_channel_buffer(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER, vout->next_rdy_ipu_buf, vout->v4l2_bufs[index].m.offset); ret += select_display_buffer(vout, vout->next_rdy_ipu_buf); @@ -499,11 +499,11 @@ static void mxc_v4l2out_timer_handler(unsigned long arg) /* if first come back from fb blank, recover correct stack */ if (old_fb_blank != FB_BLANK_UNBLANK) { if (vout->next_disp_ipu_buf == 1) - ipu_select_buffer(vout->display_ch, IPU_INPUT_BUFFER, 0); + ipu_select_buffer(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER, 0); else - ipu_select_buffer(vout->display_ch, IPU_INPUT_BUFFER, 1); + ipu_select_buffer(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER, 1); } - if (ipu_get_cur_buffer_idx(vout->display_ch, IPU_INPUT_BUFFER) + if (ipu_get_cur_buffer_idx(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER) == vout->next_disp_ipu_buf) { dev_dbg(&vout->video_dev->dev, "IPU disp busy\n"); index = peek_next_buf(&vout->ready_q); @@ -531,15 +531,15 @@ static void mxc_v4l2out_timer_handler(unsigned long arg) vout->ipu_buf_p[vout->next_rdy_ipu_buf] = last_index_n; vout->ipu_buf[vout->next_rdy_ipu_buf] = index; vout->ipu_buf_n[vout->next_rdy_ipu_buf] = index; - ret = ipu_update_channel_buffer(vout->post_proc_ch, + ret = ipu_update_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, vout->next_rdy_ipu_buf, vout->v4l2_bufs[index].m.offset); - ret += ipu_update_channel_buffer(MEM_VDI_PRP_VF_MEM_P, + ret += ipu_update_channel_buffer(vout->ipu, MEM_VDI_PRP_VF_MEM_P, IPU_INPUT_BUFFER, vout->next_rdy_ipu_buf, vout->v4l2_bufs[index_p].m.offset + vout->bytesperline); - ret += ipu_update_channel_buffer(MEM_VDI_PRP_VF_MEM_N, + ret += ipu_update_channel_buffer(vout->ipu, MEM_VDI_PRP_VF_MEM_N, IPU_INPUT_BUFFER, vout->next_rdy_ipu_buf, vout->v4l2_bufs[index_n].m.offset + vout->bytesperline); @@ -549,7 +549,7 @@ static void mxc_v4l2out_timer_handler(unsigned long arg) if (vout->pp_split) { vout->ipu_buf[!vout->next_rdy_ipu_buf] = index; /* always left stripe */ - ret = ipu_update_channel_buffer(vout->post_proc_ch, + ret = ipu_update_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, 0,/* vout->next_rdy_ipu_buf,*/ (vout->v4l2_bufs[index].m.offset) + @@ -558,7 +558,7 @@ static void mxc_v4l2out_timer_handler(unsigned long arg) /* the U/V offset has to be updated inside of IDMAC */ /* according to stripe offset */ - ret += ipu_update_channel_offset(vout->post_proc_ch, + ret += ipu_update_channel_offset(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, vout->v2f.fmt.pix.pixelformat, vout->v2f.fmt.pix.width, @@ -569,7 +569,7 @@ static void mxc_v4l2out_timer_handler(unsigned long arg) vout->pp_up_stripe.input_column, vout->pp_left_stripe.input_column); } else - ret = ipu_update_channel_buffer(vout->post_proc_ch, + ret = ipu_update_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, vout->next_rdy_ipu_buf, vout->v4l2_bufs[index].m.offset); @@ -584,9 +584,9 @@ static void mxc_v4l2out_timer_handler(unsigned long arg) /* set next buffer ready */ if (LOAD_3FIELDS(vout)) - ret = ipu_select_multi_vdi_buffer(vout->next_rdy_ipu_buf); + ret = ipu_select_multi_vdi_buffer(vout->ipu, vout->next_rdy_ipu_buf); else - ret = ipu_select_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, + ret = ipu_select_buffer(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, vout->next_rdy_ipu_buf); if (ret < 0) { dev_err(&vout->video_dev->dev, @@ -680,12 +680,12 @@ static irqreturn_t mxc_v4l2out_work_irq_handler(int irq, void *dev_id) vout->pp_down_stripe.input_column; } - ret = ipu_update_channel_buffer(vout->post_proc_ch, + ret = ipu_update_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, (1 - local_buffer), (vout->v4l2_bufs[vout->ipu_buf[disp_buf_num]].m.offset) + eba_offset + vertical_offset * vout->bytesperline); - ret += ipu_update_channel_offset(vout->post_proc_ch, + ret += ipu_update_channel_offset(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, vout->v2f.fmt.pix.pixelformat, vout->v2f.fmt.pix.width, @@ -697,7 +697,7 @@ static irqreturn_t mxc_v4l2out_work_irq_handler(int irq, void *dev_id) eba_offset); /* select right stripe */ - ret += ipu_select_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, + ret += ipu_select_buffer(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, (1 - local_buffer)); if (ret < 0) dev_err(&vout->video_dev->dev, @@ -735,17 +735,17 @@ static irqreturn_t mxc_v4l2out_work_irq_handler(int irq, void *dev_id) eba_offset = vout->display_bufs[disp_buf_num_next] + pp_out_buf_offset + eba_offset; - ipu_update_channel_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, + ipu_update_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_OUTPUT_BUFFER, local_buffer, eba_offset); /* next buffer ready */ - ret = ipu_select_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, local_buffer); + ret = ipu_select_buffer(vout->ipu, vout->post_proc_ch, IPU_OUTPUT_BUFFER, local_buffer); /* next stripe_buffer index 0..7 */ vout->pp_split_buf_num = (vout->pp_split_buf_num + vout->pp_split) & 0x7; } else { disp_buf_num = vout->next_done_ipu_buf; - ret += ipu_select_buffer(vout->display_input_ch, IPU_OUTPUT_BUFFER, + ret += ipu_select_buffer(vout->ipu, vout->display_input_ch, IPU_OUTPUT_BUFFER, vout->next_done_ipu_buf); } @@ -798,16 +798,16 @@ static int init_VDI_channel(vout_data *vout, ipu_channel_params_t params) { struct device *dev = &vout->video_dev->dev; - if (ipu_init_channel(MEM_VDI_PRP_VF_MEM, ¶ms) != 0) { + if (ipu_init_channel(vout->ipu, MEM_VDI_PRP_VF_MEM, ¶ms) != 0) { dev_dbg(dev, "Error initializing VDI current channel\n"); return -EINVAL; } if (LOAD_3FIELDS(vout)) { - if (ipu_init_channel(MEM_VDI_PRP_VF_MEM_P, ¶ms) != 0) { + if (ipu_init_channel(vout->ipu, MEM_VDI_PRP_VF_MEM_P, ¶ms) != 0) { dev_err(dev, "Error initializing VDI previous channel\n"); return -EINVAL; } - if (ipu_init_channel(MEM_VDI_PRP_VF_MEM_N, ¶ms) != 0) { + if (ipu_init_channel(vout->ipu, MEM_VDI_PRP_VF_MEM_N, ¶ms) != 0) { dev_err(dev, "Error initializing VDI next channel\n"); return -EINVAL; } @@ -829,7 +829,7 @@ static int init_VDI_in_channel_buffer(vout_data *vout, uint32_t in_pixel_fmt, { struct device *dev = &vout->video_dev->dev; - if (ipu_init_channel_buffer(MEM_VDI_PRP_VF_MEM, IPU_INPUT_BUFFER, + if (ipu_init_channel_buffer(vout->ipu, MEM_VDI_PRP_VF_MEM, IPU_INPUT_BUFFER, in_pixel_fmt, in_width, in_height, stride, IPU_ROTATE_NONE, vout->v4l2_bufs[vout->ipu_buf[0]].m.offset, @@ -840,7 +840,7 @@ static int init_VDI_in_channel_buffer(vout_data *vout, uint32_t in_pixel_fmt, return -EINVAL; } if (LOAD_3FIELDS(vout)) { - if (ipu_init_channel_buffer(MEM_VDI_PRP_VF_MEM_P, + if (ipu_init_channel_buffer(vout->ipu, MEM_VDI_PRP_VF_MEM_P, IPU_INPUT_BUFFER, in_pixel_fmt, in_width, in_height, stride, IPU_ROTATE_NONE, @@ -851,7 +851,7 @@ static int init_VDI_in_channel_buffer(vout_data *vout, uint32_t in_pixel_fmt, dev_err(dev, "Error initializing VDI previous input buffer\n"); return -EINVAL; } - if (ipu_init_channel_buffer(MEM_VDI_PRP_VF_MEM_N, + if (ipu_init_channel_buffer(vout->ipu, MEM_VDI_PRP_VF_MEM_N, IPU_INPUT_BUFFER, in_pixel_fmt, in_width, in_height, stride, IPU_ROTATE_NONE, @@ -914,7 +914,7 @@ static int init_VDI(ipu_channel_params_t params, vout_data *vout, return -ENOBUFS; } - if (ipu_init_channel_buffer(vout->post_proc_ch, + if (ipu_init_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_OUTPUT_BUFFER, params.mem_prp_vf_mem. out_pixel_fmt, out_width, @@ -926,11 +926,11 @@ static int init_VDI(ipu_channel_params_t params, vout_data *vout, return -EINVAL; } - if (ipu_init_channel(MEM_ROT_VF_MEM, NULL) != 0) { + if (ipu_init_channel(vout->ipu, MEM_ROT_VF_MEM, NULL) != 0) { dev_err(dev, "Error initializing PP ROT channel\n"); return -EINVAL; } - if (ipu_init_channel_buffer(MEM_ROT_VF_MEM, + if (ipu_init_channel_buffer(vout->ipu, MEM_ROT_VF_MEM, IPU_INPUT_BUFFER, params.mem_prp_vf_mem. out_pixel_fmt, out_width, @@ -949,7 +949,7 @@ static int init_VDI(ipu_channel_params_t params, vout_data *vout, out_height = vout->crop_current.height; } - if (ipu_init_channel_buffer(MEM_ROT_VF_MEM, + if (ipu_init_channel_buffer(vout->ipu, MEM_ROT_VF_MEM, IPU_OUTPUT_BUFFER, params.mem_prp_vf_mem. out_pixel_fmt, out_width, @@ -962,15 +962,15 @@ static int init_VDI(ipu_channel_params_t params, vout_data *vout, return -EINVAL; } - if (ipu_link_channels(vout->post_proc_ch, MEM_ROT_VF_MEM) < 0) + if (ipu_link_channels(vout->ipu, vout->post_proc_ch, MEM_ROT_VF_MEM) < 0) return -EINVAL; vout->display_input_ch = MEM_ROT_VF_MEM; - ipu_enable_channel(MEM_ROT_VF_MEM); - ipu_select_buffer(MEM_ROT_VF_MEM, IPU_OUTPUT_BUFFER, 0); - ipu_select_buffer(MEM_ROT_VF_MEM, IPU_OUTPUT_BUFFER, 1); + ipu_enable_channel(vout->ipu, MEM_ROT_VF_MEM); + ipu_select_buffer(vout->ipu, MEM_ROT_VF_MEM, IPU_OUTPUT_BUFFER, 0); + ipu_select_buffer(vout->ipu, MEM_ROT_VF_MEM, IPU_OUTPUT_BUFFER, 1); } else { - if (ipu_init_channel_buffer(vout->post_proc_ch, + if (ipu_init_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_OUTPUT_BUFFER, params.mem_prp_vf_mem. out_pixel_fmt, out_width, @@ -1090,7 +1090,7 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout, vout->pp_split_buf_num = 0; } - if (ipu_init_channel(vout->post_proc_ch, params) != 0) { + if (ipu_init_channel(vout->ipu, vout->post_proc_ch, params) != 0) { dev_err(dev, "Error initializing PP channel\n"); return -EINVAL; } @@ -1101,7 +1101,7 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout, phy_addr1 = phy_addr0; else phy_addr1 = vout->v4l2_bufs[vout->ipu_buf[1]].m.offset; - if (ipu_init_channel_buffer(vout->post_proc_ch, + if (ipu_init_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, params->mem_pp_mem.in_pixel_fmt, params->mem_pp_mem.in_width, @@ -1131,7 +1131,7 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout, return -ENOBUFS; } - if (ipu_init_channel_buffer(vout->post_proc_ch, + if (ipu_init_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_OUTPUT_BUFFER, params->mem_pp_mem. out_pixel_fmt, out_width, @@ -1143,11 +1143,11 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout, return -EINVAL; } - if (ipu_init_channel(MEM_ROT_PP_MEM, NULL) != 0) { + if (ipu_init_channel(vout->ipu, MEM_ROT_PP_MEM, NULL) != 0) { dev_err(dev, "Error initializing PP ROT channel\n"); return -EINVAL; } - if (ipu_init_channel_buffer(MEM_ROT_PP_MEM, + if (ipu_init_channel_buffer(vout->ipu, MEM_ROT_PP_MEM, IPU_INPUT_BUFFER, params->mem_pp_mem. out_pixel_fmt, out_width, @@ -1166,7 +1166,7 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout, out_height = vout->crop_current.height; } - if (ipu_init_channel_buffer(MEM_ROT_PP_MEM, + if (ipu_init_channel_buffer(vout->ipu, MEM_ROT_PP_MEM, IPU_OUTPUT_BUFFER, params->mem_pp_mem. out_pixel_fmt, out_width, @@ -1178,15 +1178,15 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout, return -EINVAL; } - if (ipu_link_channels(vout->post_proc_ch, MEM_ROT_PP_MEM) < 0) + if (ipu_link_channels(vout->ipu, vout->post_proc_ch, MEM_ROT_PP_MEM) < 0) return -EINVAL; vout->display_input_ch = MEM_ROT_PP_MEM; - ipu_enable_channel(MEM_ROT_PP_MEM); - ipu_select_buffer(MEM_ROT_PP_MEM, IPU_OUTPUT_BUFFER, 0); - ipu_select_buffer(MEM_ROT_PP_MEM, IPU_OUTPUT_BUFFER, 1); + ipu_enable_channel(vout->ipu, MEM_ROT_PP_MEM); + ipu_select_buffer(vout->ipu, MEM_ROT_PP_MEM, IPU_OUTPUT_BUFFER, 0); + ipu_select_buffer(vout->ipu, MEM_ROT_PP_MEM, IPU_OUTPUT_BUFFER, 1); } else { - if (ipu_init_channel_buffer(vout->post_proc_ch, + if (ipu_init_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_OUTPUT_BUFFER, params->mem_pp_mem. out_pixel_fmt, out_width, @@ -1201,26 +1201,26 @@ static int init_PP(ipu_channel_params_t *params, vout_data *vout, /* fix EBAs for IDMAC channels */ if (vout->pp_split) { - ipu_update_channel_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, + ipu_update_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, 0, vout->v4l2_bufs[vout->ipu_buf[0]].m.offset + vout->pp_left_stripe.input_column + vout->pp_up_stripe.input_column * vout->bytesperline); - ipu_update_channel_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, + ipu_update_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, 1, vout->v4l2_bufs[vout->ipu_buf[0]].m.offset + vout->pp_right_stripe.input_column + vout->pp_up_stripe.input_column * vout->bytesperline); - ipu_update_channel_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, + ipu_update_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_OUTPUT_BUFFER, 0, vout->display_bufs[0] + eba_offset + vout->pp_left_stripe.output_column + vout->pp_up_stripe.output_column); - ipu_update_channel_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, + ipu_update_channel_buffer(vout->ipu, vout->post_proc_ch, IPU_OUTPUT_BUFFER, 1, vout->display_bufs[0] + eba_offset + vout->pp_right_stripe.output_column + @@ -1543,8 +1543,8 @@ static int mxc_v4l2out_streamon(vout_data *vout) vout->work_irq = -1; if (!vout->ic_bypass && (vout->work_irq > 0)) { - ipu_clear_irq(vout->work_irq); - ipu_request_irq(vout->work_irq, + ipu_clear_irq(vout->ipu, vout->work_irq); + ipu_request_irq(vout->ipu, vout->work_irq, mxc_v4l2out_work_irq_handler, 0, vout->video_dev->name, vout); } @@ -1558,37 +1558,37 @@ static int mxc_v4l2out_streamon(vout_data *vout) console_unlock(); vout->fb_blank = FB_BLANK_UNBLANK; } else { - ipu_enable_channel(vout->display_ch); + ipu_enable_channel(vout->ipu, vout->display_ch); } /* correct display ch buffer address */ - ipu_update_channel_buffer(vout->display_ch, IPU_INPUT_BUFFER, + ipu_update_channel_buffer(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER, 0, vout->display_bufs[0]); - ipu_update_channel_buffer(vout->display_ch, IPU_INPUT_BUFFER, + ipu_update_channel_buffer(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER, 1, vout->display_bufs[1]); if (!vout->ic_bypass) { #ifndef CONFIG_MXC_IPU_V1 - ipu_enable_channel(vout->post_proc_ch); + ipu_enable_channel(vout->ipu, vout->post_proc_ch); #endif if (LOAD_3FIELDS(vout)) { - ipu_enable_channel(MEM_VDI_PRP_VF_MEM_P); - ipu_enable_channel(MEM_VDI_PRP_VF_MEM_N); - ipu_select_multi_vdi_buffer(0); + ipu_enable_channel(vout->ipu, MEM_VDI_PRP_VF_MEM_P); + ipu_enable_channel(vout->ipu, MEM_VDI_PRP_VF_MEM_N); + ipu_select_multi_vdi_buffer(vout->ipu, 0); } else - ipu_select_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, 0); - ipu_select_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, 0); - ipu_select_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, 1); + ipu_select_buffer(vout->ipu, vout->post_proc_ch, IPU_INPUT_BUFFER, 0); + ipu_select_buffer(vout->ipu, vout->post_proc_ch, IPU_OUTPUT_BUFFER, 0); + ipu_select_buffer(vout->ipu, vout->post_proc_ch, IPU_OUTPUT_BUFFER, 1); #ifdef CONFIG_MXC_IPU_V1 - ipu_enable_channel(vout->post_proc_ch); + ipu_enable_channel(vout->ipu, vout->post_proc_ch); #endif } else { - ipu_update_channel_buffer(vout->display_ch, + ipu_update_channel_buffer(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER, 0, vout->v4l2_bufs[vout->ipu_buf[0]].m.offset); if (vout->offset.u_offset || vout->offset.v_offset) /* only update u/v offset */ - ipu_update_channel_offset(vout->display_ch, + ipu_update_channel_offset(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER, vout->v2f.fmt.pix.pixelformat, vout->v2f.fmt.pix.width, @@ -1598,7 +1598,7 @@ static int mxc_v4l2out_streamon(vout_data *vout) vout->offset.v_offset, 0, 0); - ipu_select_buffer(vout->display_ch, IPU_INPUT_BUFFER, 0); + ipu_select_buffer(vout->ipu, vout->display_ch, IPU_INPUT_BUFFER, 0); queue_work(vout->v4l_wq, &vout->icbypass_work); } @@ -1634,7 +1634,7 @@ static int mxc_v4l2out_streamoff(vout_data *vout) } if (!vout->ic_bypass) - ipu_free_irq(vout->work_irq, vout); + ipu_free_irq(vout->ipu, vout->work_irq, vout); if (vout->ic_bypass) cancel_work_sync(&vout->icbypass_work); @@ -1728,8 +1728,8 @@ static int mxc_v4l2out_streamoff(vout_data *vout) vout->post_proc_ch == MEM_PRP_VF_MEM) { /* SDC with Rotation */ if (!ipu_can_rotate_in_place(vout->rotate)) { - ipu_unlink_channels(MEM_PP_MEM, MEM_ROT_PP_MEM); - ipu_disable_channel(MEM_ROT_PP_MEM, true); + ipu_unlink_channels(vout->ipu, MEM_PP_MEM, MEM_ROT_PP_MEM); + ipu_disable_channel(vout->ipu, MEM_ROT_PP_MEM, true); if (vout->rot_pp_bufs[0]) { mxc_free_buffers(vout->rot_pp_bufs, @@ -1737,7 +1737,7 @@ static int mxc_v4l2out_streamoff(vout_data *vout) vout->display_buf_size); } } - ipu_disable_channel(MEM_PP_MEM, true); + ipu_disable_channel(vout->ipu, MEM_PP_MEM, true); fbi->var.accel_flags = FB_ACCEL_TRIPLE_FLAG; fbi->var.activate |= FB_ACTIVATE_FORCE; @@ -1756,15 +1756,15 @@ static int mxc_v4l2out_streamoff(vout_data *vout) vout->display_bufs[0] = 0; vout->display_bufs[1] = 0; - ipu_uninit_channel(MEM_PP_MEM); + ipu_uninit_channel(vout->ipu, MEM_PP_MEM); if (!ipu_can_rotate_in_place(vout->rotate)) - ipu_uninit_channel(MEM_ROT_PP_MEM); + ipu_uninit_channel(vout->ipu, MEM_ROT_PP_MEM); } else if (INTERLACED_CONTENT(vout) && (vout->post_proc_ch == MEM_VDI_PRP_VF_MEM)) { if (!ipu_can_rotate_in_place(vout->rotate)) { - ipu_unlink_channels(MEM_VDI_PRP_VF_MEM, + ipu_unlink_channels(vout->ipu, MEM_VDI_PRP_VF_MEM, MEM_ROT_VF_MEM); - ipu_disable_channel(MEM_ROT_VF_MEM, true); + ipu_disable_channel(vout->ipu, MEM_ROT_VF_MEM, true); if (vout->rot_pp_bufs[0]) { mxc_free_buffers(vout->rot_pp_bufs, @@ -1773,10 +1773,10 @@ static int mxc_v4l2out_streamoff(vout_data *vout) } } - ipu_disable_channel(MEM_VDI_PRP_VF_MEM, true); + ipu_disable_channel(vout->ipu, MEM_VDI_PRP_VF_MEM, true); if (LOAD_3FIELDS(vout)) { - ipu_disable_channel(MEM_VDI_PRP_VF_MEM_P, true); - ipu_disable_channel(MEM_VDI_PRP_VF_MEM_N, true); + ipu_disable_channel(vout->ipu, MEM_VDI_PRP_VF_MEM_P, true); + ipu_disable_channel(vout->ipu, MEM_VDI_PRP_VF_MEM_N, true); } fbi->var.accel_flags = FB_ACCEL_TRIPLE_FLAG; @@ -1796,13 +1796,13 @@ static int mxc_v4l2out_streamoff(vout_data *vout) vout->display_bufs[0] = 0; vout->display_bufs[1] = 0; - ipu_uninit_channel(MEM_VDI_PRP_VF_MEM); + ipu_uninit_channel(vout->ipu, MEM_VDI_PRP_VF_MEM); if (LOAD_3FIELDS(vout)) { - ipu_uninit_channel(MEM_VDI_PRP_VF_MEM_P); - ipu_uninit_channel(MEM_VDI_PRP_VF_MEM_N); + ipu_uninit_channel(vout->ipu, MEM_VDI_PRP_VF_MEM_P); + ipu_uninit_channel(vout->ipu, MEM_VDI_PRP_VF_MEM_N); } if (!ipu_can_rotate_in_place(vout->rotate)) - ipu_uninit_channel(MEM_ROT_VF_MEM); + ipu_uninit_channel(vout->ipu, MEM_ROT_VF_MEM); } vout->ready_q.head = vout->ready_q.tail = 0; @@ -2284,7 +2284,7 @@ mxc_v4l2out_do_ioctl(struct file *file, (void *)vout-> v4l2_bufs[index] .reserved, sizeof(param))) - ipu_set_csc_coefficients(vout-> + ipu_set_csc_coefficients(vout->ipu, vout-> display_ch, param); queue_buf(&vout->ready_q, index); @@ -2504,7 +2504,8 @@ mxc_v4l2out_do_ioctl(struct file *file, break; } - if (ipu_ch == MEM_BG_SYNC) { + if ((ipu_ch == MEM_BG_SYNC) && + (!strncmp(fbi->fix.id, "DISP3", 5))) { fbnum = i; break; } @@ -2713,7 +2714,7 @@ static int mxc_v4l2out_probe(struct platform_device *pdev) vout->cur_disp_output = -1; for (i = 0; i < num_registered_fb; i++) { char *idstr = registered_fb[i]->fix.id; - if (strncmp(idstr, "DISP", 4) == 0) { + if (strncmp(idstr, "DISP3", 5) == 0) { int disp_num = idstr[4] - '0'; if (disp_num == 3) { if (strcmp(idstr, "DISP3 BG - DI1") == 0) @@ -2737,6 +2738,8 @@ static int mxc_v4l2out_probe(struct platform_device *pdev) } vout->crop_current = vout->crop_bounds[vout->cur_disp_output]; + vout->ipu = ipu_get_soc(0); + platform_set_drvdata(pdev, vout); if (device_create_file(&vout->video_dev->dev, diff --git a/drivers/media/video/mxc/output/mxc_v4l2_output.h b/drivers/media/video/mxc/output/mxc_v4l2_output.h index c38bfdd3b5f0..f1dc4800ed9a 100644 --- a/drivers/media/video/mxc/output/mxc_v4l2_output.h +++ b/drivers/media/video/mxc/output/mxc_v4l2_output.h @@ -151,6 +151,7 @@ typedef struct _vout_data { u16 xres; /* width of physical frame (BGs) */ u16 yres; /* heigth of physical frame (BGs)*/ + void *ipu; } vout_data; #endif |