コード例 #1
0
bool s5p_vlayer_set_bottom_address(unsigned long buf_in)
{
	u32 t_y_addr = 0;
	u32 t_c_addr = 0;
	u32 b_y_addr = 0;
	u32 b_c_addr = 0;

	u32 img_width = g_s5ptv_status.vl_basic_param.img_width;

	struct s5p_video_img_address *addr =
		(struct s5p_video_img_address *)buf_in;
	enum s5p_tv_vp_err verr;
	enum s5p_vp_src_color s_color = g_s5ptv_status.src_color;

	if (s_color == VPROC_SRC_COLOR_NV12IW) {
		g_s5ptv_status.vl_basic_param.top_y_address =
			addr->y_address - img_width;
		g_s5ptv_status.vl_basic_param.top_c_address =
			addr->c_address - img_width;
	}

	s5p_vlayer_calc_inner_values();

	t_y_addr = g_s5ptv_status.vl_top_y_address;
	t_c_addr = g_s5ptv_status.vl_top_c_address;
	b_y_addr = g_s5ptv_status.vl_bottom_y_address;
	b_c_addr = g_s5ptv_status.vl_bottom_c_address;

	if (s5p_vlayer_wait_previous_update()) {
		pr_err("%s::s5p_vlayer_wait_previous_update() fail\n",
			__func__);
		return false;
	}

	verr = s5p_vp_set_bottom_field_address(b_y_addr, b_c_addr);
	if (verr != VPROC_NO_ERROR) {
		pr_err("%s::s5p_vp_set_bottom_field_address() fail\n",
			__func__);
		return false;
	}

	if (g_s5ptv_status.src_color == VPROC_SRC_COLOR_NV12IW) {
		verr = s5p_vp_set_top_field_address(t_y_addr, t_c_addr);
		if (verr != VPROC_NO_ERROR) {
			pr_err("%s::s5p_vp_set_top_field_address() fail\n",
			__func__);
			return false;
		}
	}

	verr = s5p_vp_update();
	if (verr != VPROC_NO_ERROR) {
		pr_err("%s::s5p_vp_update() fail\n", __func__);
		return false;
	}

	return true;
}
コード例 #2
0
enum s5p_tv_vp_err s5p_vp_init_layer(
	u32 top_y_addr,
	u32 top_c_addr,
	u32 bottom_y_addr,
	u32 bottom_c_addr,
	enum s5p_endian_type src_img_endian,
	u32 img_width,
	u32 img_height,
	u32 src_off_x,
	u32 src_x_fract_step,
	u32 src_off_y,
	u32 src_width,
	u32 src_height,
	u32 dst_off_x,
	u32 dst_off_y,
	u32 dst_width,
	u32 dst_height,
	bool ipc_2d)
{
	enum s5p_tv_vp_err ret = VPROC_NO_ERROR;

	VPPRINTK("src_img_endian(%d)\n", src_img_endian);

	writel(1, g_vp_base + S5P_VP_ENDIAN_MODE);

	ret = s5p_vp_set_top_field_address(top_y_addr, top_c_addr);
	if (ret != VPROC_NO_ERROR) {
		pr_err("s5p_vp_set_top_field_address(%d, %d) fail\n",
			top_y_addr, top_c_addr);
		return ret;
	}

	ret = s5p_vp_set_bottom_field_address(bottom_y_addr, bottom_c_addr);
	if (ret != VPROC_NO_ERROR) {
		pr_err("s5p_vp_set_bottom_field_address(%d, %d) fail\n",
			bottom_y_addr, bottom_c_addr);
		return ret;
	}

	ret = s5p_vp_set_img_size(img_width, img_height);
	if (ret != VPROC_NO_ERROR) {
		pr_err("s5p_vp_set_img_size(%d, %d) fail\n",
			img_width, img_height);
		return ret;
	}

	s5p_vp_set_src_position(src_off_x, src_x_fract_step, src_off_y);
	s5p_vp_set_dest_position(dst_off_x, dst_off_y);
	s5p_vp_set_src_dest_size(src_width, src_height, dst_width,
				dst_height, ipc_2d);

	VPPRINTK("S5P_VP_ENDIAN_MODE(0x%08x)\n", readl(g_vp_base + S5P_VP_ENDIAN_MODE));

	return ret;
}
コード例 #3
0
bool s5p_vlayer_set_top_address(unsigned long buf_in)
{
	u32 t_y_addr = 0;
	u32 t_c_addr = 0;
	u32 b_y_addr = 0;
	u32 b_c_addr = 0;

	struct s5p_video_img_address *addr =
		(struct s5p_video_img_address *)buf_in;
	enum s5p_tv_vp_err verr;

	g_s5ptv_status.vl_basic_param.top_y_address = addr->y_address;
	g_s5ptv_status.vl_basic_param.top_c_address = addr->c_address;

	s5p_vlayer_calc_inner_values();

	t_y_addr = g_s5ptv_status.vl_top_y_address;
	t_c_addr = g_s5ptv_status.vl_top_c_address;
	b_y_addr = g_s5ptv_status.vl_bottom_y_address;
	b_c_addr = g_s5ptv_status.vl_bottom_c_address;

	if (s5p_vlayer_wait_previous_update()) {
		pr_err("%s::s5p_vlayer_wait_previous_update() fail\n",
			__func__);
		return false;
	}

	verr = s5p_vp_set_top_field_address(t_y_addr, t_c_addr);
	if (verr != VPROC_NO_ERROR) {
		pr_err("%s::s5p_vp_set_top_field_address() fail\n", __func__);
		return false;
	}

	if (check_input_mode(g_s5ptv_status.src_color) == INTERLACED) {
		s5p_vp_set_field_id(g_s5ptv_status.field_id);
		verr = s5p_vp_set_bottom_field_address(b_y_addr, b_c_addr);
		if (verr != VPROC_NO_ERROR) {
			pr_err("%s::s5p_vp_set_bottom_field_address() fail\n", __func__);
			return false;
		}
	}

	verr = s5p_vp_update();
	if (verr != VPROC_NO_ERROR) {
		pr_err("%s::s5p_vp_update() fail\n", __func__);
		return false;
	}

	return true;
}
コード例 #4
0
ファイル: vp.c プロジェクト: haraldh/samsung-kernel-galaxysii
int s5p_vp_init_layer(u32 top_y_addr,
			u32 top_c_addr,
			u32 bottom_y_addr,
			u32 bottom_c_addr,
			enum s5p_tv_endian src_img_endian,
			u32 img_width,
			u32 img_height,
			u32 src_off_x,
			u32 src_x_fract_step,
			u32 src_off_y,
			u32 src_width,
			u32 src_height,
			u32 dst_off_x,
			u32 dst_off_y,
			u32 dst_width,
			u32 dst_height,
			bool ipc_2d)
{
	int error = 0;

	VPPRINTK("%d\n\r", src_img_endian);

	writel(1, vp_base + S5P_VP_ENDIAN_MODE);

	error = s5p_vp_set_top_field_address(top_y_addr, top_c_addr);

	if (error != 0)
		return error;

	error = s5p_vp_set_bottom_field_address(bottom_y_addr,
		bottom_c_addr);

	if (error != 0)
		return error;

	error = s5p_vp_set_img_size(img_width, img_height);

	if (error != 0)
		return error;

	s5p_vp_set_src_position(src_off_x, src_x_fract_step, src_off_y);

	s5p_vp_set_dest_position(dst_off_x, dst_off_y);

	s5p_vp_set_src_dest_size(src_width, src_height, dst_width,
		dst_height, ipc_2d);

	return error;
}