+ u32 mask, val;
+ int hwc_size;
+
+ if (win->state == 1) {
+ if (win->id == 0) {
+ mask = m_WIN0_EN | m_WIN0_FORMAT | m_WIN0_RB_SWAP;
+ val = v_WIN0_EN(win->state) |
+ v_WIN0_FORMAT(win->area[0].fmt_cfg) |
+ v_WIN0_RB_SWAP(win->area[0].swap_rb);
+ lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
+ lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_YRGB,
+ v_X_SCL_FACTOR(win->scale_yrgb_x) |
+ v_Y_SCL_FACTOR(win->scale_yrgb_y));
+ lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_CBR,
+ v_X_SCL_FACTOR(win->scale_cbcr_x) |
+ v_Y_SCL_FACTOR(win->scale_cbcr_y));
+ lcdc_msk_reg(lcdc_dev, WIN0_VIR,
+ m_YRGB_VIR | m_CBBR_VIR,
+ v_YRGB_VIR(win->area[0].y_vir_stride) |
+ v_CBBR_VIR(win->area[0].uv_vir_stride));
+ lcdc_writel(lcdc_dev, WIN0_ACT_INFO,
+ v_ACT_WIDTH(win->area[0].xact) |
+ v_ACT_HEIGHT(win->area[0].yact));
+ lcdc_writel(lcdc_dev, WIN0_DSP_ST,
+ v_DSP_STX(win->area[0].dsp_stx) |
+ v_DSP_STY(win->area[0].dsp_sty));
+ lcdc_writel(lcdc_dev, WIN0_DSP_INFO,
+ v_DSP_WIDTH(win->post_cfg.xsize) |
+ v_DSP_HEIGHT(win->post_cfg.ysize));
+
+ lcdc_writel(lcdc_dev, WIN0_YRGB_MST,
+ win->area[0].y_addr);
+ lcdc_writel(lcdc_dev, WIN0_CBR_MST,
+ win->area[0].uv_addr);
+ } else if (win->id == 1) {
+ mask = m_WIN1_EN | m_WIN1_FORMAT | m_WIN1_RB_SWAP;
+ val = v_WIN1_EN(win->state) |
+ v_WIN1_FORMAT(win->area[0].fmt_cfg) |
+ v_WIN1_RB_SWAP(win->area[0].swap_rb);
+ lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
+ lcdc_writel(lcdc_dev, WIN1_SCL_FACTOR_YRGB,
+ v_X_SCL_FACTOR(win->scale_yrgb_x) |
+ v_Y_SCL_FACTOR(win->scale_yrgb_y));
+
+ lcdc_msk_reg(lcdc_dev, WIN1_VIR, m_YRGB_VIR,
+ v_YRGB_VIR(win->area[0].y_vir_stride));
+ lcdc_writel(lcdc_dev, WIN1_ACT_INFO,
+ v_ACT_WIDTH(win->area[0].xact) |
+ v_ACT_HEIGHT(win->area[0].yact));
+ lcdc_writel(lcdc_dev, WIN1_DSP_INFO,
+ v_DSP_WIDTH(win->post_cfg.xsize) |
+ v_DSP_HEIGHT(win->post_cfg.ysize));
+ lcdc_writel(lcdc_dev, WIN1_DSP_ST,
+ v_DSP_STX(win->area[0].dsp_stx) |
+ v_DSP_STY(win->area[0].dsp_sty));
+ lcdc_writel(lcdc_dev, WIN1_MST, win->area[0].y_addr);
+ } else if (win->id == 2) {
+ mask = m_HWC_EN | m_HWC_LODAD_EN;
+ val = v_HWC_EN(win->state) | v_HWC_LODAD_EN(1);
+ lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
+ if ((win->area[0].xsize == 32) &&
+ (win->area[0].ysize == 32))
+ hwc_size = 0;
+ else if ((win->area[0].xsize == 64) &&
+ (win->area[0].ysize == 64))
+ hwc_size = 1;
+ else
+ dev_err(lcdc_dev->dev,
+ "unsupport hwc size:x=%d,y=%d\n",
+ win->area[0].xsize,
+ win->area[0].ysize);
+ lcdc_writel(lcdc_dev, HWC_DSP_ST,
+ v_DSP_STX(win->area[0].dsp_stx) |
+ v_DSP_STY(win->area[0].dsp_sty));
+ lcdc_writel(lcdc_dev, HWC_MST, win->area[0].y_addr);
+ }
+ } else {
+ win->area[0].y_addr = 0;
+ win->area[0].uv_addr = 0;
+ if (win->id == 0) {
+ lcdc_msk_reg(lcdc_dev,
+ SYS_CTRL, m_WIN0_EN, v_WIN0_EN(0));
+ lcdc_writel(lcdc_dev, WIN0_YRGB_MST,
+ win->area[0].y_addr);
+ lcdc_writel(lcdc_dev, WIN0_CBR_MST,
+ win->area[0].uv_addr);
+ } else if (win->id == 1) {
+ lcdc_msk_reg(lcdc_dev,
+ SYS_CTRL, m_WIN1_EN, v_WIN1_EN(0));
+ lcdc_writel(lcdc_dev, WIN1_MST, win->area[0].y_addr);
+ } else if (win->id == 2) {
+ lcdc_msk_reg(lcdc_dev,
+ SYS_CTRL, m_HWC_EN | m_HWC_LODAD_EN,
+ v_HWC_EN(0) | v_HWC_LODAD_EN(0));
+ lcdc_writel(lcdc_dev, HWC_MST, win->area[0].y_addr);
+ }
+ }
+ rk3036_lcdc_alpha_cfg(lcdc_dev);