int s5ptvfb_display_off(struct s5p_tv_status *ctrl) { __s5p_vm_set_layer_priority(VM_GPR0_LAYER, 10); __s5p_vm_set_layer_show(VM_GPR0_LAYER, false); return 0; }
bool _s5p_grp_stop(enum s5p_tv_vmx_layer vm_layer) { enum s5p_tv_vmx_err merr; struct s5p_tv_status *st = &s5ptv_status; GRPPRINTK("()\n\r"); merr = __s5p_vm_set_layer_show(vm_layer, false); if (merr != VMIXER_NO_ERROR) return false; merr = __s5p_vm_set_layer_priority(vm_layer, 0); if (merr != VMIXER_NO_ERROR) return false; __s5p_vm_start(); st->grp_layer_enable[vm_layer] = false; GRPPRINTK("()\n\r"); return true; }
bool _s5p_vlayer_set_priority(unsigned long buf_in) { s5p_tv_vmx_err merr; u32 pri; s5ptv_status.vl_basic_param.priority = (unsigned int)(buf_in); pri = s5ptv_status.vl_basic_param.priority; merr = __s5p_vm_set_layer_priority(VM_VIDEO_LAYER, pri); if (merr != VMIXER_NO_ERROR) return false; return true; }
s5p_tv_vmx_err __s5p_vm_init_layer(s5p_tv_vmx_layer layer, bool show, //video,grp bool win_blending, //video,grp u32 alpha, //video,grp u32 priority, //video,grp s5p_tv_vmx_color_fmt color, //grp bool blank_change, //grp bool pixel_blending, //grp bool premul, //grp u32 blank_color, //grp u32 base_addr, //grp u32 span, //grp u32 width, //grp u32 height, //grp u32 src_offs_x, //grp u32 src_offs_y, //grp u32 dst_offs_x, //grp u32 dst_offs_y) //grp { u32 temp_reg = 0; VMPRINTK("%d,%d,%d,%d,%d,%d,%d,%d,%d,0x%x,0x%x,%d,%d,%d,%d,%d,%d,%d)\n\r", layer, show, win_blending, alpha, priority, color, blank_change, pixel_blending, premul, blank_color,base_addr, span, width, height, src_offs_x, src_offs_y, dst_offs_x, dst_offs_y); switch (layer) { case VM_VIDEO_LAYER: temp_reg = (win_blending) ? S5P_MXR_VP_BLEND_ENABLE : S5P_MXR_VP_BLEND_DISABLE; temp_reg |= S5P_MXR_VP_ALPHA_VALUE(alpha); writel(temp_reg, mixer_base + S5P_MXR_VIDEO_CFG); break; case VM_GPR0_LAYER: temp_reg = (blank_change) ? S5P_MXR_BLANK_NOT_CHANGE_NEW_PIXEL : S5P_MXR_BLANK_CHANGE_NEW_PIXEL; temp_reg |= (premul) ? S5P_MXR_PRE_MUL_MODE : S5P_MXR_NORMAL_MODE; temp_reg |= (win_blending) ? S5P_MXR_WIN_BLEND_ENABLE : S5P_MXR_WIN_BLEND_DISABLE; temp_reg |= (pixel_blending) ? S5P_MXR_PIXEL_BLEND_ENABLE : S5P_MXR_PIXEL_BLEND_DISABLE; temp_reg |= S5P_MXR_EG_COLOR_FORMAT(color); temp_reg |= S5P_MXR_GRP_ALPHA_VALUE(alpha); writel(temp_reg, mixer_base + S5P_MXR_GRAPHIC0_CFG); writel(S5P_MXR_GPR_BLANK_COLOR(blank_color), mixer_base + S5P_MXR_GRAPHIC0_BLANK); VMPRINTK("--(0x%x)\n\r", readl(mixer_base + S5P_MXR_GRAPHIC0_CFG)); VMPRINTK("--(0x%x)\n\r", readl(mixer_base + S5P_MXR_GRAPHIC0_BLANK)); __s5p_vm_set_grp_layer_size(layer, span, width, height, src_offs_x, src_offs_y); __s5p_vm_set_grp_base_address(layer, base_addr); __s5p_vm_set_grp_layer_position(layer, dst_offs_x, dst_offs_y); break; case VM_GPR1_LAYER: temp_reg = (blank_change) ? S5P_MXR_BLANK_NOT_CHANGE_NEW_PIXEL : S5P_MXR_BLANK_CHANGE_NEW_PIXEL; temp_reg |= (premul) ? S5P_MXR_PRE_MUL_MODE : S5P_MXR_NORMAL_MODE; temp_reg |= (win_blending) ? S5P_MXR_WIN_BLEND_ENABLE : S5P_MXR_WIN_BLEND_DISABLE; temp_reg |= (pixel_blending) ? S5P_MXR_PIXEL_BLEND_ENABLE : S5P_MXR_PIXEL_BLEND_DISABLE; temp_reg |= S5P_MXR_EG_COLOR_FORMAT(color); temp_reg |= S5P_MXR_GRP_ALPHA_VALUE(alpha); writel(temp_reg, mixer_base + S5P_MXR_GRAPHIC1_CFG); writel(S5P_MXR_GPR_BLANK_COLOR(blank_color), mixer_base + S5P_MXR_GRAPHIC1_BLANK); VMPRINTK("--(0x%x)\n\r", readl(mixer_base + S5P_MXR_GRAPHIC1_CFG)); VMPRINTK("--(0x%x)\n\r", readl(mixer_base + S5P_MXR_GRAPHIC1_BLANK)); __s5p_vm_set_grp_layer_size(layer, span, width, height, src_offs_x, src_offs_y); __s5p_vm_set_grp_base_address(layer, base_addr); __s5p_vm_set_grp_layer_position(layer, dst_offs_x, dst_offs_y); break; default: VMPRINTK("invalid layer parameter = %d\n\r", layer); return S5P_TV_VMX_ERR_INVALID_PARAM; break; } __s5p_vm_set_layer_priority(layer, priority); __s5p_vm_set_layer_show(layer, show); return VMIXER_NO_ERROR; }
enum s5p_tv_vmx_err __s5p_vm_init_layer(enum s5p_tv_disp_mode mode, enum s5p_tv_vmx_layer layer, bool show, bool win_blending, u32 alpha, u32 priority, enum s5p_tv_vmx_color_fmt color, bool blank_change, bool pixel_blending, bool premul, u32 blank_color, u32 base_addr, u32 span, u32 width, u32 height, u32 src_offs_x, u32 src_offs_y, u32 dst_offs_x, u32 dst_offs_y, u32 dst_width, u32 dst_height) { u32 temp_reg = 0; u32 h_factor = 0, v_factor = 0; VMPRINTK("%d, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x,\ 0x%x, %d, %d, %d, %d, %d, %d, %d)\n\r", layer, show, win_blending, alpha, priority, color, blank_change, pixel_blending, premul, blank_color, base_addr, span, width, height, src_offs_x, src_offs_y, dst_offs_x, dst_offs_y); switch (layer) { case VM_VIDEO_LAYER: temp_reg = (win_blending) ? S5P_MXR_VP_BLEND_ENABLE : S5P_MXR_VP_BLEND_DISABLE; temp_reg |= S5P_MXR_VP_ALPHA_VALUE(alpha); /* temp yuv pxl limiter setting*/ temp_reg &= ~(1<<17); writel(temp_reg, mixer_base + S5P_MXR_VIDEO_CFG); break; case VM_GPR0_LAYER: temp_reg = (blank_change) ? S5P_MXR_BLANK_NOT_CHANGE_NEW_PIXEL : S5P_MXR_BLANK_CHANGE_NEW_PIXEL; temp_reg |= (premul) ? S5P_MXR_PRE_MUL_MODE : S5P_MXR_NORMAL_MODE; temp_reg |= (win_blending) ? S5P_MXR_WIN_BLEND_ENABLE : S5P_MXR_WIN_BLEND_DISABLE; temp_reg |= (pixel_blending) ? S5P_MXR_PIXEL_BLEND_ENABLE : S5P_MXR_PIXEL_BLEND_DISABLE; temp_reg |= S5P_MXR_EG_COLOR_FORMAT(color); temp_reg |= S5P_MXR_GRP_ALPHA_VALUE(alpha); writel(temp_reg, mixer_base + S5P_MXR_GRAPHIC0_CFG); writel(S5P_MXR_GPR_BLANK_COLOR(blank_color), mixer_base + S5P_MXR_GRAPHIC0_BLANK); VMPRINTK("--(0x%x)\n\r", readl(mixer_base + S5P_MXR_GRAPHIC0_CFG)); VMPRINTK("--(0x%x)\n\r", readl(mixer_base + S5P_MXR_GRAPHIC0_BLANK)); __s5p_vm_set_grp_layer_size(layer, span, width, height, src_offs_x, src_offs_y); __s5p_vm_set_grp_base_address(layer, base_addr); __s5p_vm_set_grp_layer_position(layer, dst_offs_x, dst_offs_y); temp_reg = readl(mixer_base + S5P_MXR_GRAPHIC0_WH); h_factor = grp_scaling_factor(width, dst_width, 1); v_factor = grp_scaling_factor(height, dst_height, 0); temp_reg &= ~((0x3<<28)|(0x3<<12)); if (v_factor) { u32 reg = readl(mixer_base + S5P_MXR_CFG); /* In interlaced mode, vertical scaling must be * replaced by PROGRESSIVE_MODE - pixel duplication */ if (mode == TVOUT_1080I_50 || mode == TVOUT_1080I_59 || mode == TVOUT_1080I_60) { /* scaled up by progressive setting */ reg |= S5P_MXR_PROGRESSVE_MODE; writel(reg, mixer_base + S5P_MXR_CFG); } else /* scaled up by scale factor */ temp_reg |= v_factor << 12; } else { u32 reg = readl(mixer_base + S5P_MXR_CFG); /* * if v_factor is 0, recover the original mode */ if (mode == TVOUT_1080I_50 || mode == TVOUT_1080I_59 || mode == TVOUT_1080I_60) { reg &= S5P_MXR_INTERLACE_MODE; writel(reg, mixer_base + S5P_MXR_CFG); } } temp_reg |= h_factor << 28; writel(temp_reg , mixer_base + S5P_MXR_GRAPHIC0_WH); break; case VM_GPR1_LAYER: temp_reg = (blank_change) ? S5P_MXR_BLANK_NOT_CHANGE_NEW_PIXEL : S5P_MXR_BLANK_CHANGE_NEW_PIXEL; temp_reg |= (premul) ? S5P_MXR_PRE_MUL_MODE : S5P_MXR_NORMAL_MODE; temp_reg |= (win_blending) ? S5P_MXR_WIN_BLEND_ENABLE : S5P_MXR_WIN_BLEND_DISABLE; temp_reg |= (pixel_blending) ? S5P_MXR_PIXEL_BLEND_ENABLE : S5P_MXR_PIXEL_BLEND_DISABLE; temp_reg |= S5P_MXR_EG_COLOR_FORMAT(color); temp_reg |= S5P_MXR_GRP_ALPHA_VALUE(alpha); writel(temp_reg, mixer_base + S5P_MXR_GRAPHIC1_CFG); writel(S5P_MXR_GPR_BLANK_COLOR(blank_color), mixer_base + S5P_MXR_GRAPHIC1_BLANK); VMPRINTK("--(0x%x)\n\r", readl(mixer_base + S5P_MXR_GRAPHIC1_CFG)); VMPRINTK("--(0x%x)\n\r", readl(mixer_base + S5P_MXR_GRAPHIC1_BLANK)); __s5p_vm_set_grp_layer_size(layer, span, width, height, src_offs_x, src_offs_y); __s5p_vm_set_grp_base_address(layer, base_addr); __s5p_vm_set_grp_layer_position(layer, dst_offs_x, dst_offs_y); temp_reg = readl(mixer_base + S5P_MXR_GRAPHIC1_WH); h_factor = grp_scaling_factor(width, dst_width, 1); v_factor = grp_scaling_factor(height, dst_height, 0); temp_reg &= ~((0x3<<28)|(0x3<<12)); if (v_factor) { u32 reg = readl(mixer_base + S5P_MXR_CFG); /* In interlaced mode, vertical scaling must be * replaced by PROGRESSIVE_MODE - pixel duplication */ if (mode == TVOUT_1080I_50 || mode == TVOUT_1080I_59 || mode == TVOUT_1080I_60) { /* scaled up by progressive setting */ reg |= S5P_MXR_PROGRESSVE_MODE; writel(reg, mixer_base + S5P_MXR_CFG); } else /* scaled up by scale factor */ temp_reg |= v_factor << 12; } else { u32 reg = readl(mixer_base + S5P_MXR_CFG); /* * if v_factor is 0, recover the original mode */ if (mode == TVOUT_1080I_50 || mode == TVOUT_1080I_59 || mode == TVOUT_1080I_60) { reg &= S5P_MXR_INTERLACE_MODE; writel(reg, mixer_base + S5P_MXR_CFG); } } temp_reg |= h_factor << 28; writel(temp_reg , mixer_base + S5P_MXR_GRAPHIC1_WH); break; default: VMPRINTK("invalid layer parameter = %d\n\r", layer); return S5P_TV_VMX_ERR_INVALID_PARAM; break; } __s5p_vm_set_layer_priority(layer, priority); __s5p_vm_set_layer_show(layer, show); return VMIXER_NO_ERROR; }