示例#1
0
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);
}
示例#2
0
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, &regs->v_colorkey_y);
	writel(color_a.U_ColorAlpha, &regs->v_colorkey_u);
	writel(b, &regs->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;
}