On 03/06/2012 06:53 AM, Jingoo Han wrote:
> This patch adds s3c_fb_driverdata s3c_fb_data_exynos5 for EXYNOS5
> and adds extended timing control setting.
>
> EXYNOS5 FIMD needs extended setting for video timing control.
> Additional bits are added to VIDTCON2, VIDWxxADD2, VIDOSDxA and
> VIDOSDxB registers in order to set timing value for lager resolution.
>
> Also, address offset of VIDTCONx registers is changed from 0x0
> to 0x20000, thus variable type should be changed to int type
> to handle the address offset of VIDTCONx registers for EXYNOS5 FIMD.
>
> Signed-off-by: Jingoo Han <[email protected]>
Applied.
No need to resend when just over a week has passed. I usually try to
wait a week for non-trivial patches to give others a chance to comment
on it before applying.
Thanks,
Florian Tobias Schandinat
> ---
> v2: fix commit message from VIDCONx to VIDTCONx.
>
> arch/arm/plat-samsung/include/plat/regs-fb.h | 24 ++++++++----
> drivers/video/s3c-fb.c | 52 +++++++++++++++++++++++--
> 2 files changed, 63 insertions(+), 13 deletions(-)
>
> diff --git a/arch/arm/plat-samsung/include/plat/regs-fb.h
> b/arch/arm/plat-samsung/include/plat/regs-fb.h
> index bbb16e0..9a78012 100644
> --- a/arch/arm/plat-samsung/include/plat/regs-fb.h
> +++ b/arch/arm/plat-samsung/include/plat/regs-fb.h
> @@ -167,15 +167,17 @@
> #define VIDTCON1_HSPW(_x) ((_x) << 0)
>
> #define VIDTCON2 (0x18)
> +#define VIDTCON2_LINEVAL_E(_x) ((((_x) & 0x800) >> 11)
> << 23)
> #define VIDTCON2_LINEVAL_MASK (0x7ff << 11)
> #define VIDTCON2_LINEVAL_SHIFT (11)
> #define VIDTCON2_LINEVAL_LIMIT (0x7ff)
> -#define VIDTCON2_LINEVAL(_x) ((_x) << 11)
> +#define VIDTCON2_LINEVAL(_x) (((_x) & 0x7ff) << 11)
>
> +#define VIDTCON2_HOZVAL_E(_x) ((((_x) & 0x800) >> 11)
> << 22)
> #define VIDTCON2_HOZVAL_MASK (0x7ff << 0)
> #define VIDTCON2_HOZVAL_SHIFT (0)
> #define VIDTCON2_HOZVAL_LIMIT (0x7ff)
> -#define VIDTCON2_HOZVAL(_x) ((_x) << 0)
> +#define VIDTCON2_HOZVAL(_x) (((_x) & 0x7ff) << 0)
>
> /* WINCONx */
>
> @@ -231,25 +233,29 @@
> /* Local input channels (windows 0-2) */
> #define SHADOWCON_CHx_LOCAL_ENABLE(_win) (1 << (5 + (_win)))
>
> +#define VIDOSDxA_TOPLEFT_X_E(_x) ((((_x) & 0x800) >> 11) << 23)
> #define VIDOSDxA_TOPLEFT_X_MASK (0x7ff << 11)
> #define VIDOSDxA_TOPLEFT_X_SHIFT (11)
> #define VIDOSDxA_TOPLEFT_X_LIMIT (0x7ff)
> -#define VIDOSDxA_TOPLEFT_X(_x) ((_x) << 11)
> +#define VIDOSDxA_TOPLEFT_X(_x) (((_x) & 0x7ff) << 11)
>
> +#define VIDOSDxA_TOPLEFT_Y_E(_x) ((((_x) & 0x800) >> 11) << 22)
> #define VIDOSDxA_TOPLEFT_Y_MASK (0x7ff << 0)
> #define VIDOSDxA_TOPLEFT_Y_SHIFT (0)
> #define VIDOSDxA_TOPLEFT_Y_LIMIT (0x7ff)
> -#define VIDOSDxA_TOPLEFT_Y(_x) ((_x) << 0)
> +#define VIDOSDxA_TOPLEFT_Y(_x) (((_x) & 0x7ff) << 0)
>
> +#define VIDOSDxB_BOTRIGHT_X_E(_x) ((((_x) & 0x800) >> 11) << 23)
> #define VIDOSDxB_BOTRIGHT_X_MASK (0x7ff << 11)
> #define VIDOSDxB_BOTRIGHT_X_SHIFT (11)
> #define VIDOSDxB_BOTRIGHT_X_LIMIT (0x7ff)
> -#define VIDOSDxB_BOTRIGHT_X(_x) ((_x) << 11)
> +#define VIDOSDxB_BOTRIGHT_X(_x) (((_x) & 0x7ff) << 11)
>
> +#define VIDOSDxB_BOTRIGHT_Y_E(_x) ((((_x) & 0x800) >> 11) << 22)
> #define VIDOSDxB_BOTRIGHT_Y_MASK (0x7ff << 0)
> #define VIDOSDxB_BOTRIGHT_Y_SHIFT (0)
> #define VIDOSDxB_BOTRIGHT_Y_LIMIT (0x7ff)
> -#define VIDOSDxB_BOTRIGHT_Y(_x) ((_x) << 0)
> +#define VIDOSDxB_BOTRIGHT_Y(_x) (((_x) & 0x7ff) << 0)
>
> /* For VIDOSD[1..4]C */
> #define VIDISD14C_ALPHA0_R(_x) ((_x) << 20)
> @@ -281,15 +287,17 @@
> #define VIDW_BUF_END1(_buff) (0xD4 + ((_buff) * 8))
> #define VIDW_BUF_SIZE(_buff) (0x100 + ((_buff) * 4))
>
> +#define VIDW_BUF_SIZE_OFFSET_E(_x) ((((_x) & 0x2000) >> 13) << 27)
> #define VIDW_BUF_SIZE_OFFSET_MASK (0x1fff << 13)
> #define VIDW_BUF_SIZE_OFFSET_SHIFT (13)
> #define VIDW_BUF_SIZE_OFFSET_LIMIT (0x1fff)
> -#define VIDW_BUF_SIZE_OFFSET(_x) ((_x) << 13)
> +#define VIDW_BUF_SIZE_OFFSET(_x) (((_x) & 0x1fff) << 13)
>
> +#define VIDW_BUF_SIZE_PAGEWIDTH_E(_x) ((((_x) & 0x2000) >>
> 13) << 26)
> #define VIDW_BUF_SIZE_PAGEWIDTH_MASK (0x1fff << 0)
> #define VIDW_BUF_SIZE_PAGEWIDTH_SHIFT (0)
> #define VIDW_BUF_SIZE_PAGEWIDTH_LIMIT (0x1fff)
> -#define VIDW_BUF_SIZE_PAGEWIDTH(_x) ((_x) << 0)
> +#define VIDW_BUF_SIZE_PAGEWIDTH(_x) (((_x) & 0x1fff) << 0)
>
> /* Interrupt controls and status */
>
> diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c
> index 1fb7ddf..f310516 100644
> --- a/drivers/video/s3c-fb.c
> +++ b/drivers/video/s3c-fb.c
> @@ -89,7 +89,7 @@ struct s3c_fb;
> struct s3c_fb_variant {
> unsigned int is_2443:1;
> unsigned short nr_windows;
> - unsigned short vidtcon;
> + unsigned int vidtcon;
> unsigned short wincon;
> unsigned short winmap;
> unsigned short keycon;
> @@ -568,7 +568,9 @@ static int s3c_fb_set_par(struct fb_info *info)
> writel(data, regs + sfb->variant.vidtcon + 4);
>
> data = VIDTCON2_LINEVAL(var->yres - 1) |
> - VIDTCON2_HOZVAL(var->xres - 1);
> + VIDTCON2_HOZVAL(var->xres - 1) |
> + VIDTCON2_LINEVAL_E(var->yres - 1) |
> + VIDTCON2_HOZVAL_E(var->xres - 1);
> writel(data, regs + sfb->variant.vidtcon + 8);
> }
>
> @@ -584,17 +586,23 @@ static int s3c_fb_set_par(struct fb_info *info)
>
> pagewidth = (var->xres * var->bits_per_pixel) >> 3;
> data = VIDW_BUF_SIZE_OFFSET(info->fix.line_length - pagewidth) |
> - VIDW_BUF_SIZE_PAGEWIDTH(pagewidth);
> + VIDW_BUF_SIZE_PAGEWIDTH(pagewidth) |
> + VIDW_BUF_SIZE_OFFSET_E(info->fix.line_length - pagewidth) |
> + VIDW_BUF_SIZE_PAGEWIDTH_E(pagewidth);
> writel(data, regs + sfb->variant.buf_size + (win_no * 4));
>
> /* write 'OSD' registers to control position of framebuffer */
>
> - data = VIDOSDxA_TOPLEFT_X(0) | VIDOSDxA_TOPLEFT_Y(0);
> + data = VIDOSDxA_TOPLEFT_X(0) | VIDOSDxA_TOPLEFT_Y(0) |
> + VIDOSDxA_TOPLEFT_X_E(0) | VIDOSDxA_TOPLEFT_Y_E(0);
> writel(data, regs + VIDOSD_A(win_no, sfb->variant));
>
> data = VIDOSDxB_BOTRIGHT_X(s3c_fb_align_word(var->bits_per_pixel,
> var->xres - 1)) |
> - VIDOSDxB_BOTRIGHT_Y(var->yres - 1);
> + VIDOSDxB_BOTRIGHT_Y(var->yres - 1) |
> + VIDOSDxB_BOTRIGHT_X_E(s3c_fb_align_word(var->bits_per_pixel,
> + var->xres - 1)) |
> + VIDOSDxB_BOTRIGHT_Y_E(var->yres - 1);
>
> writel(data, regs + VIDOSD_B(win_no, sfb->variant));
>
> @@ -1903,6 +1911,37 @@ static struct s3c_fb_driverdata s3c_fb_data_exynos4 = {
> .win[4] = &s3c_fb_data_s5p_wins[4],
> };
>
> +static struct s3c_fb_driverdata s3c_fb_data_exynos5 = {
> + .variant = {
> + .nr_windows = 5,
> + .vidtcon = VIDTCON0,
> + .wincon = WINCON(0),
> + .winmap = WINxMAP(0),
> + .keycon = WKEYCON,
> + .osd = VIDOSD_BASE,
> + .osd_stride = 16,
> + .buf_start = VIDW_BUF_START(0),
> + .buf_size = VIDW_BUF_SIZE(0),
> + .buf_end = VIDW_BUF_END(0),
> +
> + .palette = {
> + [0] = 0x2400,
> + [1] = 0x2800,
> + [2] = 0x2c00,
> + [3] = 0x3000,
> + [4] = 0x3400,
> + },
> + .has_shadowcon = 1,
> + .has_blendcon = 1,
> + .has_fixvclk = 1,
> + },
> + .win[0] = &s3c_fb_data_s5p_wins[0],
> + .win[1] = &s3c_fb_data_s5p_wins[1],
> + .win[2] = &s3c_fb_data_s5p_wins[2],
> + .win[3] = &s3c_fb_data_s5p_wins[3],
> + .win[4] = &s3c_fb_data_s5p_wins[4],
> +};
> +
> /* S3C2443/S3C2416 style hardware */
> static struct s3c_fb_driverdata s3c_fb_data_s3c2443 = {
> .variant = {
> @@ -1981,6 +2020,9 @@ static struct platform_device_id s3c_fb_driver_ids[] = {
> .name = "exynos4-fb",
> .driver_data = (unsigned long)&s3c_fb_data_exynos4,
> }, {
> + .name = "exynos5-fb",
> + .driver_data = (unsigned long)&s3c_fb_data_exynos5,
> + }, {
> .name = "s3c2443-fb",
> .driver_data = (unsigned long)&s3c_fb_data_s3c2443,
> }, {
--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html