Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f5ec546f authored by Pawel Osciak's avatar Pawel Osciak Committed by Linus Torvalds
Browse files

s3c-fb: add SHADOWCON shadow register locking support for S5PV210



S5PV210 allows per-window locking of register value updates from shadow
registers.

Signed-off-by: default avatarPawel Osciak <p.osciak@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Cc: InKi Dae <inki.dae@samsung.com>
Cc: Ben Dooks <ben-linux@fluff.org>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d4787291
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -220,6 +220,9 @@
#define WINCON1_BPPMODE_25BPP_A1888		(0xd << 2)
#define WINCON1_BPPMODE_25BPP_A1888		(0xd << 2)
#define WINCON1_BPPMODE_28BPP_A4888		(0xd << 2)
#define WINCON1_BPPMODE_28BPP_A4888		(0xd << 2)


/* S5PV210 */
#define SHADOWCON				(0x34)
#define SHADOWCON_WINx_PROTECT(_win)		(1 << (10 + (_win)))


#define VIDOSDxA_TOPLEFT_X_MASK			(0x7ff << 11)
#define VIDOSDxA_TOPLEFT_X_MASK			(0x7ff << 11)
#define VIDOSDxA_TOPLEFT_X_SHIFT		(11)
#define VIDOSDxA_TOPLEFT_X_SHIFT		(11)
+36 −4
Original line number Original line Diff line number Diff line
@@ -79,6 +79,7 @@ struct s3c_fb;
 * @osd: The base for the OSD registers.
 * @osd: The base for the OSD registers.
 * @palette: Address of palette memory, or 0 if none.
 * @palette: Address of palette memory, or 0 if none.
 * @has_prtcon: Set if has PRTCON register.
 * @has_prtcon: Set if has PRTCON register.
 * @has_shadowcon: Set if has SHADOWCON register.
 */
 */
struct s3c_fb_variant {
struct s3c_fb_variant {
	unsigned int	is_2443:1;
	unsigned int	is_2443:1;
@@ -95,6 +96,7 @@ struct s3c_fb_variant {
	unsigned short	palette[S3C_FB_MAX_WIN];
	unsigned short	palette[S3C_FB_MAX_WIN];


	unsigned int	has_prtcon:1;
	unsigned int	has_prtcon:1;
	unsigned int	has_shadowcon:1;
};
};


/**
/**
@@ -362,6 +364,36 @@ static int s3c_fb_align_word(unsigned int bpp, unsigned int pix)
	return ALIGN(pix, pix_per_word);
	return ALIGN(pix, pix_per_word);
}
}


/**
 * shadow_protect_win() - disable updating values from shadow registers at vsync
 *
 * @win: window to protect registers for
 * @protect: 1 to protect (disable updates)
 */
static void shadow_protect_win(struct s3c_fb_win *win, bool protect)
{
	struct s3c_fb *sfb = win->parent;
	u32 reg;

	if (protect) {
		if (sfb->variant.has_prtcon) {
			writel(PRTCON_PROTECT, sfb->regs + PRTCON);
		} else if (sfb->variant.has_shadowcon) {
			reg = readl(sfb->regs + SHADOWCON);
			writel(reg | SHADOWCON_WINx_PROTECT(win->index),
				sfb->regs + SHADOWCON);
		}
	} else {
		if (sfb->variant.has_prtcon) {
			writel(0, sfb->regs + PRTCON);
		} else if (sfb->variant.has_shadowcon) {
			reg = readl(sfb->regs + SHADOWCON);
			writel(reg & ~SHADOWCON_WINx_PROTECT(win->index),
				sfb->regs + SHADOWCON);
		}
	}
}

/**
/**
 * s3c_fb_set_par() - framebuffer request to set new framebuffer state.
 * s3c_fb_set_par() - framebuffer request to set new framebuffer state.
 * @info: The framebuffer to change.
 * @info: The framebuffer to change.
@@ -810,14 +842,12 @@ static int s3c_fb_pan_display(struct fb_var_screeninfo *var,


	/* Temporarily turn off per-vsync update from shadow registers until
	/* Temporarily turn off per-vsync update from shadow registers until
	 * both start and end addresses are updated to prevent corruption */
	 * both start and end addresses are updated to prevent corruption */
	if (sfb->variant.has_prtcon)
	shadow_protect_win(win, 1);
		writel(PRTCON_PROTECT, sfb->regs + PRTCON);


	writel(info->fix.smem_start + start_boff, buf + sfb->variant.buf_start);
	writel(info->fix.smem_start + start_boff, buf + sfb->variant.buf_start);
	writel(info->fix.smem_start + end_boff, buf + sfb->variant.buf_end);
	writel(info->fix.smem_start + end_boff, buf + sfb->variant.buf_end);


	if (sfb->variant.has_prtcon)
	shadow_protect_win(win, 0);
		writel(0, sfb->regs + PRTCON);


	return 0;
	return 0;
}
}
@@ -1530,6 +1560,8 @@ static struct s3c_fb_driverdata s3c_fb_data_s5pv210 __devinitdata = {
			[3] = 0x3000,
			[3] = 0x3000,
			[4] = 0x3400,
			[4] = 0x3400,
		},
		},

		.has_shadowcon	= 1,
	},
	},
	.win[0]	= &s3c_fb_data_64xx_wins[0],
	.win[0]	= &s3c_fb_data_64xx_wins[0],
	.win[1]	= &s3c_fb_data_64xx_wins[1],
	.win[1]	= &s3c_fb_data_64xx_wins[1],