ps3fb: kill ps3fb_res
authorGeert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Wed, 6 Feb 2008 09:39:31 +0000 (01:39 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Wed, 6 Feb 2008 18:41:17 +0000 (10:41 -0800)
kill ps3fb_res[], as all information it contains can be obtained in some other
way.

Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/video/ps3fb.c

index 229727a..b9c5b4e 100644 (file)
@@ -134,42 +134,17 @@ static struct ps3fb_priv ps3fb;
 struct ps3fb_par {
        u32 pseudo_palette[16];
        int mode_id, new_mode_id;
-       int res_index;
        unsigned int num_frames;        /* num of frame buffers */
        unsigned int width;
        unsigned int height;
+       unsigned int ddr_line_length;
+       unsigned int ddr_frame_size;
+       unsigned int xdr_frame_size;
        unsigned long full_offset;      /* start of fullscreen DDR fb */
        unsigned long fb_offset;        /* start of actual DDR fb */
        unsigned long pan_offset;
 };
 
-struct ps3fb_res_table {
-       u32 xres;
-       u32 yres;
-       u32 xoff;
-       u32 yoff;
-       u32 type;
-};
-#define PS3FB_RES_FULL 1
-static const struct ps3fb_res_table ps3fb_res[] = {
-       /* res_x,y   margin_x,y  full */
-       {  720,  480,  72,  48 , 0},
-       {  720,  576,  72,  58 , 0},
-       { 1280,  720,  78,  38 , 0},
-       { 1920, 1080, 116,  58 , 0},
-       /* full mode */
-       {  720,  480,   0,   0 , PS3FB_RES_FULL},
-       {  720,  576,   0,   0 , PS3FB_RES_FULL},
-       { 1280,  720,   0,   0 , PS3FB_RES_FULL},
-       { 1920, 1080,   0,   0 , PS3FB_RES_FULL},
-       /* vesa: normally full mode */
-       { 1280,  768,   0,   0 , 0},
-       { 1280, 1024,   0,   0 , 0},
-       { 1920, 1200,   0,   0 , 0},
-       {    0,    0,   0,   0 , 0} };
-
-/* default resolution */
-#define GPU_RES_INDEX  0               /* 720 x 480 */
 
 static const struct fb_videomode ps3fb_modedb[] = {
     /* 60 Hz broadcast modes (modes "1" to "5") */
@@ -295,37 +270,6 @@ module_param(ps3fb_mode, int, 0);
 
 static char *mode_option __devinitdata;
 
-static int ps3fb_get_res_table(u32 xres, u32 yres, int mode)
-{
-       int full_mode;
-       unsigned int i;
-       u32 x, y, f;
-
-       full_mode = (mode & PS3AV_MODE_FULL) ? PS3FB_RES_FULL : 0;
-       for (i = 0;; i++) {
-               x = ps3fb_res[i].xres;
-               y = ps3fb_res[i].yres;
-               f = ps3fb_res[i].type;
-
-               if (!x) {
-                       pr_debug("ERROR: ps3fb_get_res_table()\n");
-                       return -1;
-               }
-
-               if (full_mode == PS3FB_RES_FULL && f != PS3FB_RES_FULL)
-                       continue;
-
-               if (x == xres && (yres == 0 || y == yres))
-                       break;
-
-               x = x - 2 * ps3fb_res[i].xoff;
-               y = y - 2 * ps3fb_res[i].yoff;
-               if (x == xres && (yres == 0 || y == yres))
-                       break;
-       }
-       return i;
-}
-
 static unsigned int ps3fb_find_mode(const struct fb_var_screeninfo *var,
                                    u32 *ddr_line_length, u32 *xdr_line_length)
 {
@@ -433,8 +377,7 @@ static void ps3fb_sync_image(struct device *dev, u64 frame_offset,
 static int ps3fb_sync(struct fb_info *info, u32 frame)
 {
        struct ps3fb_par *par = info->par;
-       int i, error = 0;
-       u32 ddr_line_length, xdr_line_length;
+       int error = 0;
        u64 ddr_base, xdr_base;
 
        if (frame > par->num_frames - 1) {
@@ -444,16 +387,13 @@ static int ps3fb_sync(struct fb_info *info, u32 frame)
                goto out;
        }
 
-       i = par->res_index;
-       xdr_line_length = info->fix.line_length;
-       ddr_line_length = ps3fb_res[i].xres * BPP;
-       xdr_base = frame * info->var.yres_virtual * xdr_line_length;
-       ddr_base = frame * ps3fb_res[i].yres * ddr_line_length;
+       xdr_base = frame * par->xdr_frame_size;
+       ddr_base = frame * par->ddr_frame_size;
 
        ps3fb_sync_image(info->device, ddr_base + par->full_offset,
                         ddr_base + par->fb_offset, xdr_base + par->pan_offset,
-                        par->width, par->height, ddr_line_length,
-                        xdr_line_length);
+                        par->width, par->height, par->ddr_line_length,
+                        info->fix.line_length);
 
 out:
        return error;
@@ -572,8 +512,9 @@ static int ps3fb_set_par(struct fb_info *info)
 {
        struct ps3fb_par *par = info->par;
        unsigned int mode, ddr_line_length, xdr_line_length, lines, maxlines;
-       int i;
+       unsigned int ddr_xoff, ddr_yoff;
        unsigned long offset;
+       const struct fb_videomode *vmode;
        u64 dst;
 
        dev_dbg(info->device, "xres:%d xv:%d yres:%d yv:%d clock:%d\n",
@@ -584,8 +525,7 @@ static int ps3fb_set_par(struct fb_info *info)
        if (!mode)
                return -EINVAL;
 
-       i = ps3fb_get_res_table(info->var.xres, info->var.yres, mode);
-       par->res_index = i;
+       vmode = ps3fb_default_mode(mode | PS3AV_MODE_FULL);
 
        info->fix.smem_start = virt_to_abs(ps3fb.xdr_ea);
        info->fix.smem_len = ps3fb.xdr_size;
@@ -595,9 +535,12 @@ static int ps3fb_set_par(struct fb_info *info)
 
        info->screen_base = (char __iomem *)ps3fb.xdr_ea;
 
+       par->ddr_line_length = ddr_line_length;
+       par->ddr_frame_size = vmode->yres * ddr_line_length;
+       par->xdr_frame_size = info->var.yres_virtual * xdr_line_length;
+
        par->num_frames = ps3fb.xdr_size /
-                         max(ps3fb_res[i].yres * ddr_line_length,
-                             info->var.yres_virtual * xdr_line_length);
+                         max(par->ddr_frame_size, par->xdr_frame_size);
 
        /* Keep the special bits we cannot set using fb_var_screeninfo */
        par->new_mode_id = (par->new_mode_id & ~PS3AV_MODE_MASK) | mode;
@@ -606,7 +549,9 @@ static int ps3fb_set_par(struct fb_info *info)
        par->height = info->var.yres;
 
        /* Start of the virtual frame buffer (relative to fullscreen) */
-       offset = ps3fb_res[i].yoff * ddr_line_length + ps3fb_res[i].xoff * BPP;
+       ddr_xoff = info->var.left_margin - vmode->left_margin;
+       ddr_yoff = info->var.upper_margin - vmode->upper_margin;
+       offset = ddr_yoff * ddr_line_length + ddr_xoff * BPP;
 
        par->fb_offset = GPU_ALIGN_UP(offset);
        par->full_offset = par->fb_offset - offset;
@@ -625,13 +570,13 @@ static int ps3fb_set_par(struct fb_info *info)
        memset(ps3fb.xdr_ea, 0, ps3fb.xdr_size);
 
        /* Clear DDR frame buffer memory */
-       lines = ps3fb_res[i].yres * par->num_frames;
+       lines = vmode->yres * par->num_frames;
        if (par->full_offset)
                lines++;
        maxlines = ps3fb.xdr_size / ddr_line_length;
        for (dst = 0; lines; dst += maxlines * ddr_line_length) {
                unsigned int l = min(lines, maxlines);
-               ps3fb_sync_image(info->device, 0, dst, 0, ps3fb_res[i].xres, l,
+               ps3fb_sync_image(info->device, 0, dst, 0, vmode->xres, l,
                                 ddr_line_length, ddr_line_length);
                lines -= l;
        }
@@ -1052,14 +997,13 @@ static int __devinit ps3fb_probe(struct ps3_system_bus_device *dev)
        struct fb_info *info;
        struct ps3fb_par *par;
        int retval = -ENOMEM;
-       u32 xres, yres;
        u64 ddr_lpar = 0;
        u64 lpar_dma_control = 0;
        u64 lpar_driver_info = 0;
        u64 lpar_reports = 0;
        u64 lpar_reports_size = 0;
        u64 xdr_lpar;
-       int status, res_index;
+       int status;
        struct task_struct *task;
        unsigned long max_ps3fb_size;
 
@@ -1079,13 +1023,6 @@ static int __devinit ps3fb_probe(struct ps3_system_bus_device *dev)
                ps3fb_mode = ps3av_get_mode();
        dev_dbg(&dev->core, "ps3fb_mode: %d\n", ps3fb_mode);
 
-       if (ps3fb_mode > 0 &&
-           !ps3av_video_mode2res(ps3fb_mode, &xres, &yres)) {
-               res_index = ps3fb_get_res_table(xres, yres, ps3fb_mode);
-               dev_dbg(&dev->core, "res_index:%d\n", res_index);
-       } else
-               res_index = GPU_RES_INDEX;
-
        atomic_set(&ps3fb.f_count, -1); /* fbcon opens ps3fb */
        atomic_set(&ps3fb.ext_flip, 0); /* for flip with vsync */
        init_waitqueue_head(&ps3fb.wait_vsync);
@@ -1158,7 +1095,6 @@ static int __devinit ps3fb_probe(struct ps3_system_bus_device *dev)
        par = info->par;
        par->mode_id = ~ps3fb_mode;     /* != ps3fb_mode, to trigger change */
        par->new_mode_id = ps3fb_mode;
-       par->res_index = res_index;
        par->num_frames = 1;
 
        info->screen_base = (char __iomem *)ps3fb.xdr_ea;