Commit ae5591e3 authored by York Sun's avatar York Sun Committed by Linus Torvalds

freescale DIU: add virtual resolution and panning support

Application can now have the virtual resoltuion and use FBIOPAN_DISPLAY
ioctl to pan.
Signed-off-by: default avatarYork Sun <yorksun@freescale.com>
Cc: Kumar Gala <galak@gate.crashing.org>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Cc: Krzysztof Helt <krzysztof.h1@poczta.fm>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8c5a1cf0
...@@ -777,6 +777,22 @@ static void unmap_video_memory(struct fb_info *info) ...@@ -777,6 +777,22 @@ static void unmap_video_memory(struct fb_info *info)
info->fix.smem_len = 0; info->fix.smem_len = 0;
} }
/*
* Using the fb_var_screeninfo in fb_info we set the aoi of this
* particular framebuffer. It is a light version of fsl_diu_set_par.
*/
static int fsl_diu_set_aoi(struct fb_info *info)
{
struct fb_var_screeninfo *var = &info->var;
struct mfb_info *mfbi = info->par;
struct diu_ad *ad = mfbi->ad;
/* AOI should not be greater than display size */
ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset);
ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d);
return 0;
}
/* /*
* Using the fb_var_screeninfo in fb_info we set the resolution of this * Using the fb_var_screeninfo in fb_info we set the resolution of this
* particular framebuffer. This function alters the fb_fix_screeninfo stored * particular framebuffer. This function alters the fb_fix_screeninfo stored
...@@ -817,11 +833,11 @@ static int fsl_diu_set_par(struct fb_info *info) ...@@ -817,11 +833,11 @@ static int fsl_diu_set_par(struct fb_info *info)
diu_ops.get_pixel_format(var->bits_per_pixel, diu_ops.get_pixel_format(var->bits_per_pixel,
machine_data->monitor_port); machine_data->monitor_port);
ad->addr = cpu_to_le32(info->fix.smem_start); ad->addr = cpu_to_le32(info->fix.smem_start);
ad->src_size_g_alpha = cpu_to_le32((var->yres << 12) | ad->src_size_g_alpha = cpu_to_le32((var->yres_virtual << 12) |
var->xres) | mfbi->g_alpha; var->xres_virtual) | mfbi->g_alpha;
/* fix me. AOI should not be greater than display size */ /* AOI should not be greater than display size */
ad->aoi_size = cpu_to_le32((var->yres << 16) | var->xres); ad->aoi_size = cpu_to_le32((var->yres << 16) | var->xres);
ad->offset_xyi = 0; ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset);
ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d);
/* Disable chroma keying function */ /* Disable chroma keying function */
...@@ -921,6 +937,8 @@ static int fsl_diu_pan_display(struct fb_var_screeninfo *var, ...@@ -921,6 +937,8 @@ static int fsl_diu_pan_display(struct fb_var_screeninfo *var,
else else
info->var.vmode &= ~FB_VMODE_YWRAP; info->var.vmode &= ~FB_VMODE_YWRAP;
fsl_diu_set_aoi(info);
return 0; return 0;
} }
...@@ -989,7 +1007,7 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd, ...@@ -989,7 +1007,7 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd,
pr_debug("set AOI display offset of index %d to (%d,%d)\n", pr_debug("set AOI display offset of index %d to (%d,%d)\n",
mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d); mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d);
fsl_diu_check_var(&info->var, info); fsl_diu_check_var(&info->var, info);
fsl_diu_set_par(info); fsl_diu_set_aoi(info);
break; break;
case MFB_GET_AOID: case MFB_GET_AOID:
aoi_d.x_aoi_d = mfbi->x_aoi_d; aoi_d.x_aoi_d = mfbi->x_aoi_d;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment