On Tue, Mar 22, 2011 at 09:27:29AM +0100, Heiko Schocher wrote:
> - add commandline options:
>   sm501fb.mode:
>     Specify resolution as "<xres>x<yres>[-<bpp>][@<refresh>]"
>   sm501fb.bpp:
>     Specify bit-per-pixel if not specified mode
> 
> - Add support for encoding display mode information
>   in the device tree using verbatim EDID block.
> 
>   If the "edid" entry in the "smi,sm501" node is present,
>   the driver will build mode database using EDID data
>   and allow setting the display modes from this database.
> 
> Signed-off-by: Heiko Schocher <h...@denx.de>

Merged, thanks.

g.

> cc: Wolfram Sang <w.s...@pengutronix.de>
> cc: Grant Likely <grant.lik...@secretlab.ca>
> cc: Benjamin Herrenschmidt <b...@kernel.crashing.org>
> cc: linux-fb...@vger.kernel.org
> cc: devicetree-disc...@ozlabs.org
> cc: Ben Dooks <b...@simtec.co.uk>
> cc: Vincent Sanders <vi...@simtec.co.uk>
> cc: Samuel Ortiz <sa...@linux.intel.com>
> cc: linux-ker...@vger.kernel.org
> cc: Randy Dunlap <rdun...@xenotime.net>
> cc: Wolfgang Denk <w...@denx.de>
> cc: Paul Mundt <let...@linux-sh.org>
> ---
> - changes since v1:
>   add Ben Dooks, Vincent Sanders and Samuel Ortiz to cc, as suggested from
>   Paul Mundt.
> - changes since v2:
>   add comments from Randy Dunlap:
>   - move parameter documentation to Documentation/fb/sm501.txt
> - changes since v3:
>   - rebased against v2.6.38-rc2
>   - split in 3 patches
>     - of support patch
>     - i/o routine patch
>     - edid support patch
> - changes since v4:
>   - add "info->pdata = &sm501fb_def_pdata;" in sm501fb_probe()
>     as Paul Mundt suggested (and I wrongly deleted)
>   - move kfree(info->edid_data); to patch 3/4
>     as edid_data is only allocated in the CONFIG_OF case
> - changes for v6:
>   - repost complete patchserie
>   - rebased against current head
> 
>  Documentation/fb/sm501.txt |   10 +++++++
>  drivers/video/sm501fb.c    |   65 ++++++++++++++++++++++++++++++++++++++++---
>  2 files changed, 70 insertions(+), 5 deletions(-)
>  create mode 100644 Documentation/fb/sm501.txt
> 
> diff --git a/Documentation/fb/sm501.txt b/Documentation/fb/sm501.txt
> new file mode 100644
> index 0000000..8d17aeb
> --- /dev/null
> +++ b/Documentation/fb/sm501.txt
> @@ -0,0 +1,10 @@
> +Configuration:
> +
> +You can pass the following kernel command line options to sm501 
> videoframebuffer:
> +
> +     sm501fb.bpp=    SM501 Display driver:
> +                     Specifiy bits-per-pixel if not specified by 'mode'
> +
> +     sm501fb.mode=   SM501 Display driver:
> +                     Specify resolution as
> +                     "<xres>x<yres>[-<bpp>][@<refresh>]"
> diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
> index 5df406c..f31252c 100644
> --- a/drivers/video/sm501fb.c
> +++ b/drivers/video/sm501fb.c
> @@ -41,6 +41,26 @@
>  #include <linux/sm501.h>
>  #include <linux/sm501-regs.h>
>  
> +#include "edid.h"
> +
> +static char *fb_mode = "640x480-16@60";
> +static unsigned long default_bpp = 16;
> +
> +static struct fb_videomode __devinitdata sm501_default_mode = {
> +     .refresh        = 60,
> +     .xres           = 640,
> +     .yres           = 480,
> +     .pixclock       = 20833,
> +     .left_margin    = 142,
> +     .right_margin   = 13,
> +     .upper_margin   = 21,
> +     .lower_margin   = 1,
> +     .hsync_len      = 69,
> +     .vsync_len      = 3,
> +     .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
> +     .vmode          = FB_VMODE_NONINTERLACED
> +};
> +
>  #define NR_PALETTE   256
>  
>  enum sm501_controller {
> @@ -77,6 +97,7 @@ struct sm501fb_info {
>       void __iomem            *regs2d;        /* 2d remapped registers */
>       void __iomem            *fbmem;         /* remapped framebuffer */
>       size_t                   fbmem_len;     /* length of remapped region */
> +     u8 *edid_data;
>  };
>  
>  /* per-framebuffer private data */
> @@ -1725,9 +1746,16 @@ static int sm501fb_init_fb(struct fb_info *fb,
>       fb->var.vmode           = FB_VMODE_NONINTERLACED;
>       fb->var.bits_per_pixel  = 16;
>  
> +     if (info->edid_data) {
> +                     /* Now build modedb from EDID */
> +                     fb_edid_to_monspecs(info->edid_data, &fb->monspecs);
> +                     fb_videomode_to_modelist(fb->monspecs.modedb,
> +                                              fb->monspecs.modedb_len,
> +                                              &fb->modelist);
> +     }
> +
>       if (enable && (pd->flags & SM501FB_FLAG_USE_INIT_MODE) && 0) {
>               /* TODO read the mode from the current display */
> -
>       } else {
>               if (pd->def_mode) {
>                       dev_info(info->dev, "using supplied mode\n");
> @@ -1737,12 +1765,34 @@ static int sm501fb_init_fb(struct fb_info *fb,
>                       fb->var.xres_virtual = fb->var.xres;
>                       fb->var.yres_virtual = fb->var.yres;
>               } else {
> -                     ret = fb_find_mode(&fb->var, fb,
> +                     if (info->edid_data)
> +                             ret = fb_find_mode(&fb->var, fb, fb_mode,
> +                                     fb->monspecs.modedb,
> +                                     fb->monspecs.modedb_len,
> +                                     &sm501_default_mode, default_bpp);
> +                     else
> +                             ret = fb_find_mode(&fb->var, fb,
>                                          NULL, NULL, 0, NULL, 8);
>  
> -                     if (ret == 0 || ret == 4) {
> -                             dev_err(info->dev,
> -                                     "failed to get initial mode\n");
> +                     switch (ret) {
> +                     case 1:
> +                             dev_info(info->dev, "using mode specified in "
> +                                             "@mode\n");
> +                             break;
> +                     case 2:
> +                             dev_info(info->dev, "using mode specified in "
> +                                     "@mode with ignored refresh rate\n");
> +                             break;
> +                     case 3:
> +                             dev_info(info->dev, "using mode default "
> +                                     "mode\n");
> +                             break;
> +                     case 4:
> +                             dev_info(info->dev, "using mode from list\n");
> +                             break;
> +                     default:
> +                             dev_info(info->dev, "ret = %d\n", ret);
> +                             dev_info(info->dev, "failed to find mode\n");
>                               return -EINVAL;
>                       }
>               }
> @@ -2157,6 +2207,11 @@ static void __exit sm501fb_cleanup(void)
>  module_init(sm501fb_init);
>  module_exit(sm501fb_cleanup);
>  
> +module_param_named(mode, fb_mode, charp, 0);
> +MODULE_PARM_DESC(mode,
> +     "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
> +module_param_named(bpp, default_bpp, ulong, 0);
> +MODULE_PARM_DESC(bpp, "Specify bit-per-pixel if not specified mode");
>  MODULE_AUTHOR("Ben Dooks, Vincent Sanders");
>  MODULE_DESCRIPTION("SM501 Framebuffer driver");
>  MODULE_LICENSE("GPL v2");
> -- 
> 1.7.4
> 
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to