Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes...
[cascardo/linux.git] / drivers / video / fsl-diu-fb.c
index 9cd36c2..fb51197 100644 (file)
@@ -479,6 +479,10 @@ static void adjust_aoi_size_position(struct fb_var_screeninfo *var,
        base_plane_width = machine_data->fsl_diu_info[0]->var.xres;
        base_plane_height = machine_data->fsl_diu_info[0]->var.yres;
 
+       if (mfbi->x_aoi_d < 0)
+               mfbi->x_aoi_d = 0;
+       if (mfbi->y_aoi_d < 0)
+               mfbi->y_aoi_d = 0;
        switch (index) {
        case 0:
                if (mfbi->x_aoi_d != 0)
@@ -777,6 +781,22 @@ static void unmap_video_memory(struct fb_info *info)
        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
  * particular framebuffer. This function alters the fb_fix_screeninfo stored
@@ -817,11 +837,11 @@ static int fsl_diu_set_par(struct fb_info *info)
                diu_ops.get_pixel_format(var->bits_per_pixel,
                                         machine_data->monitor_port);
        ad->addr    = cpu_to_le32(info->fix.smem_start);
-       ad->src_size_g_alpha = cpu_to_le32((var->yres << 12) |
-                               var->xres) | mfbi->g_alpha;
-       /* fix me. AOI should not be greater than display size */
+       ad->src_size_g_alpha = cpu_to_le32((var->yres_virtual << 12) |
+                               var->xres_virtual) | mfbi->g_alpha;
+       /* AOI should not be greater than display size */
        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);
 
        /* Disable chroma keying function */
@@ -921,6 +941,8 @@ static int fsl_diu_pan_display(struct fb_var_screeninfo *var,
        else
                info->var.vmode &= ~FB_VMODE_YWRAP;
 
+       fsl_diu_set_aoi(info);
+
        return 0;
 }
 
@@ -989,7 +1011,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",
                                 mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d);
                fsl_diu_check_var(&info->var, info);
-               fsl_diu_set_par(info);
+               fsl_diu_set_aoi(info);
                break;
        case MFB_GET_AOID:
                aoi_d.x_aoi_d = mfbi->x_aoi_d;
@@ -1649,8 +1671,10 @@ static int __init fsl_diu_init(void)
        }
 
        prop = of_get_property(np, "d-cache-size", NULL);
-       if (prop == NULL)
+       if (prop == NULL) {
+               of_node_put(np);
                return -ENODEV;
+       }
 
        /* Freescale PLRU requires 13/8 times the cache size to do a proper
           displacement flush
@@ -1659,8 +1683,10 @@ static int __init fsl_diu_init(void)
        coherence_data_size /= 8;
 
        prop = of_get_property(np, "d-cache-line-size", NULL);
-       if (prop == NULL)
+       if (prop == NULL) {
+               of_node_put(np);
                return -ENODEV;
+       }
        d_cache_line_size = *prop;
 
        of_node_put(np);