void mxr_reg_vp_format(struct mxr_device *mdev, const struct mxr_format *fmt, const struct mxr_geometry *geo) { #if defined(CONFIG_ARCH_EXYNOS4) unsigned long flags; spin_lock_irqsave(&mdev->reg_slock, flags); mxr_vsync_set_update(mdev, MXR_DISABLE); vp_write_mask(mdev, VP_MODE, fmt->cookie, VP_MODE_FMT_MASK); /* setting size of input image */ vp_write(mdev, VP_IMG_SIZE_Y, VP_IMG_HSIZE(geo->src.full_width) | VP_IMG_VSIZE(geo->src.full_height)); /* chroma height has to reduced by 2 to avoid chroma distorions */ vp_write(mdev, VP_IMG_SIZE_C, VP_IMG_HSIZE(geo->src.full_width) | VP_IMG_VSIZE(geo->src.full_height / 2)); vp_write(mdev, VP_SRC_WIDTH, geo->src.width); vp_write(mdev, VP_SRC_HEIGHT, geo->src.height); vp_write(mdev, VP_SRC_H_POSITION, VP_SRC_H_POSITION_VAL(geo->src.x_offset)); vp_write(mdev, VP_SRC_V_POSITION, geo->src.y_offset); vp_write(mdev, VP_DST_WIDTH, geo->dst.width); vp_write(mdev, VP_DST_H_POSITION, geo->dst.x_offset); if (geo->dst.field == V4L2_FIELD_INTERLACED) { vp_write(mdev, VP_DST_HEIGHT, geo->dst.height / 2); vp_write(mdev, VP_DST_V_POSITION, geo->dst.y_offset / 2); } else { vp_write(mdev, VP_DST_HEIGHT, geo->dst.height); vp_write(mdev, VP_DST_V_POSITION, geo->dst.y_offset); } vp_write(mdev, VP_H_RATIO, geo->x_ratio); vp_write(mdev, VP_V_RATIO, geo->y_ratio); vp_write(mdev, VP_ENDIAN_MODE, VP_ENDIAN_MODE_LITTLE); mxr_vsync_set_update(mdev, MXR_ENABLE); spin_unlock_irqrestore(&mdev->reg_slock, flags); #endif }
enum s5p_tv_vp_err s5p_vp_set_img_size(u32 img_width, u32 img_height) { VPPRINTK("%d, %d\n", img_width, img_height); if (VP_IMG_SIZE_ILLEGAL(img_width) || VP_IMG_SIZE_ILLEGAL(img_height)) { pr_err(" image full size is not double word align = %d, %d\n", img_width, img_height); return S5P_TV_VP_ERR_BASE_ADDRESS_MUST_DOUBLE_WORD_ALIGN; } writel(VP_IMG_HSIZE(img_width) | VP_IMG_VSIZE(img_height), g_vp_base + S5P_VP_IMG_SIZE_Y); writel(VP_IMG_HSIZE(img_width) | VP_IMG_VSIZE(img_height / 2), g_vp_base + S5P_VP_IMG_SIZE_C); VPPRINTK("img_width(%d), img_height(%d)\n", img_width, img_height); VPPRINTK("S5P_VP_IMG_SIZE_Y(0x%08x), S5P_VP_IMG_SIZE_C(0x%08x)\n", readl(g_vp_base + S5P_VP_IMG_SIZE_Y), readl(g_vp_base + S5P_VP_IMG_SIZE_C)); return VPROC_NO_ERROR; }