static inline void dma_ctrl_clr(struct xilinx_dma_chan *chan, u32 reg, u32 clr) { dma_ctrl_write(chan, reg, dma_ctrl_read(chan, reg) & ~clr); }
static inline void dma_ctrl_set(struct xilinx_dma_chan *chan, u32 reg, u32 set) { dma_ctrl_write(chan, reg, dma_ctrl_read(chan, reg) | set); }
static u32 pxa168fb_ovly_set_colorkeyalpha(struct pxa168fb_info *fbi) { struct _sColorKeyNAlpha color_a = fbi->ckey_alpha; unsigned int rb, x, layer, dma0, shift, r, b; struct pxa168fb_mach_info *mi; struct lcd_regs *regs; dev_dbg(fbi->fb_info->dev, "Enter %s\n", __func__); mi = fbi->dev->platform_data; regs = get_regs(fbi->id); dma0 = dma_ctrl_read(fbi->id, 0); shift = fbi->id ? 20 : 18; rb = layer = 0; r = color_a.Y_ColorAlpha; b = color_a.V_ColorAlpha; /* reset to 0x0 to disable color key. */ x = dma_ctrl_read(fbi->id, 1) & ~(CFG_COLOR_KEY_MASK | CFG_ALPHA_MODE_MASK | CFG_ALPHA_MASK); /* switch to color key mode */ switch (color_a.mode) { case FB_DISABLE_COLORKEY_MODE: /* do nothing */ break; case FB_ENABLE_Y_COLORKEY_MODE: x |= CFG_COLOR_KEY_MODE(0x1); break; case FB_ENABLE_U_COLORKEY_MODE: x |= CFG_COLOR_KEY_MODE(0x2); break; case FB_ENABLE_V_COLORKEY_MODE: x |= CFG_COLOR_KEY_MODE(0x4); pr_info("V colorkey not supported, Chroma key instead\n"); break; case FB_ENABLE_RGB_COLORKEY_MODE: x |= CFG_COLOR_KEY_MODE(0x3); rb = 1; break; case FB_ENABLE_R_COLORKEY_MODE: x |= CFG_COLOR_KEY_MODE(0x1); rb = 1; break; case FB_ENABLE_G_COLORKEY_MODE: x |= CFG_COLOR_KEY_MODE(0x6); pr_info("G colorkey not supported, Luma key instead\n"); break; case FB_ENABLE_B_COLORKEY_MODE: x |= CFG_COLOR_KEY_MODE(0x7); rb = 1; break; default: pr_info("unknown mode"); return -1; } /* switch to alpha path selection */ switch (color_a.alphapath) { case FB_VID_PATH_ALPHA: x |= CFG_ALPHA_MODE(0x0); layer = CFG_CKEY_DMA; if (rb) rb = ((dma0 & CFG_DMA_SWAPRB_MASK) >> 4) ^ (mi->panel_rbswap); break; case FB_GRA_PATH_ALPHA: x |= CFG_ALPHA_MODE(0x1); layer = CFG_CKEY_GRA; if (rb) rb = ((dma0 & CFG_GRA_SWAPRB_MASK) >> 12) ^ (mi->panel_rbswap); break; case FB_CONFIG_ALPHA: x |= CFG_ALPHA_MODE(0x2); rb = 0; break; default: pr_info("unknown alpha path"); return -1; } /* check whether DMA turn on RB swap for this pixelformat. */ if (rb) { if (color_a.mode == FB_ENABLE_R_COLORKEY_MODE) { x &= ~CFG_COLOR_KEY_MODE(0x1); x |= CFG_COLOR_KEY_MODE(0x7); } if (color_a.mode == FB_ENABLE_B_COLORKEY_MODE) { x &= ~CFG_COLOR_KEY_MODE(0x7); x |= CFG_COLOR_KEY_MODE(0x1); } /* exchange r b fields. */ r = color_a.V_ColorAlpha; b = color_a.Y_ColorAlpha; /* only alpha_Y take effect, switch back from V */ if (color_a.mode == FB_ENABLE_RGB_COLORKEY_MODE) { r &= 0xffffff00; r |= (color_a.Y_ColorAlpha & 0xff); } } /* configure alpha */ x |= CFG_ALPHA((color_a.config & 0xff)); dma_ctrl_write(fbi->id, 1, x); writel(r, ®s->v_colorkey_y); writel(color_a.U_ColorAlpha, ®s->v_colorkey_u); writel(b, ®s->v_colorkey_v); if (fbi->id != 2) { /* enable DMA colorkey on graphics/video layer * in panel/TV path */ x = readl(fbi->reg_base + LCD_TV_CTRL1); x &= ~(3<<shift); x |= layer<<shift; writel(x, fbi->reg_base + LCD_TV_CTRL1); } return 0; }