forked from luck/tmp_suning_uos_patched
OLPC: gxfb/lxfb: add DCON panel modes to framebuffer drivers
Since there's no way to autodetect panel modes, we're forced to hardcode them in the driver and add a big fat #ifdef. The OLPC DCON needs a specific mode line (at 1200x900). This adds it to both gxfb and lxfb. (Jordan said: We could probably detect the panel mode, but there isn't any reason to since the panel timings are well known and won't change. While OFW detection would be good computer science fu, it would be a wasted effort since its so easy to hard code them into the table.) Signed-off-by: Andres Salomon <dilinger@debian.org> Cc: Jordan Crouse <jordan.crouse@amd.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>
This commit is contained in:
parent
fd96795630
commit
3553a2fa8c
|
@ -41,7 +41,7 @@ static int vram;
|
|||
static int vt_switch;
|
||||
|
||||
/* Modes relevant to the GX (taken from modedb.c) */
|
||||
static const struct fb_videomode gx_modedb[] __initdata = {
|
||||
static struct fb_videomode gx_modedb[] __initdata = {
|
||||
/* 640x480-60 VESA */
|
||||
{ NULL, 60, 640, 480, 39682, 48, 16, 33, 10, 96, 2,
|
||||
0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
|
||||
|
@ -108,6 +108,35 @@ static const struct fb_videomode gx_modedb[] __initdata = {
|
|||
FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
|
||||
};
|
||||
|
||||
#ifdef CONFIG_OLPC
|
||||
#include <asm/olpc.h>
|
||||
|
||||
static struct fb_videomode gx_dcon_modedb[] __initdata = {
|
||||
/* The only mode the DCON has is 1200x900 */
|
||||
{ NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3,
|
||||
FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||
FB_VMODE_NONINTERLACED, 0 }
|
||||
};
|
||||
|
||||
static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size)
|
||||
{
|
||||
if (olpc_has_dcon()) {
|
||||
*modedb = (struct fb_videomode *) gx_dcon_modedb;
|
||||
*size = ARRAY_SIZE(gx_dcon_modedb);
|
||||
} else {
|
||||
*modedb = (struct fb_videomode *) gx_modedb;
|
||||
*size = ARRAY_SIZE(gx_modedb);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size)
|
||||
{
|
||||
*modedb = (struct fb_videomode *) gx_modedb;
|
||||
*size = ARRAY_SIZE(gx_modedb);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int gxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||
{
|
||||
if (var->xres > 1600 || var->yres > 1200)
|
||||
|
@ -350,6 +379,9 @@ static int __init gxfb_probe(struct pci_dev *pdev, const struct pci_device_id *i
|
|||
int ret;
|
||||
unsigned long val;
|
||||
|
||||
struct fb_videomode *modedb_ptr;
|
||||
unsigned int modedb_size;
|
||||
|
||||
info = gxfb_init_fbinfo(&pdev->dev);
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
|
@ -369,8 +401,9 @@ static int __init gxfb_probe(struct pci_dev *pdev, const struct pci_device_id *i
|
|||
else
|
||||
par->enable_crt = 1;
|
||||
|
||||
get_modedb(&modedb_ptr, &modedb_size);
|
||||
ret = fb_find_mode(&info->var, info, mode_option,
|
||||
gx_modedb, ARRAY_SIZE(gx_modedb), NULL, 16);
|
||||
modedb_ptr, modedb_size, NULL, 16);
|
||||
if (ret == 0 || ret == 4) {
|
||||
dev_err(&pdev->dev, "could not find valid video mode\n");
|
||||
ret = -EINVAL;
|
||||
|
|
|
@ -36,7 +36,7 @@ static int vt_switch;
|
|||
* we try to make it something sane - 640x480-60 is sane
|
||||
*/
|
||||
|
||||
static const struct fb_videomode geode_modedb[] __initdata = {
|
||||
static struct fb_videomode geode_modedb[] __initdata = {
|
||||
/* 640x480-60 */
|
||||
{ NULL, 60, 640, 480, 39682, 48, 8, 25, 2, 88, 2,
|
||||
FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||
|
@ -217,6 +217,35 @@ static const struct fb_videomode geode_modedb[] __initdata = {
|
|||
0, FB_VMODE_NONINTERLACED, 0 },
|
||||
};
|
||||
|
||||
#ifdef CONFIG_OLPC
|
||||
#include <asm/olpc.h>
|
||||
|
||||
static struct fb_videomode olpc_dcon_modedb[] __initdata = {
|
||||
/* The only mode the DCON has is 1200x900 */
|
||||
{ NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3,
|
||||
FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||
FB_VMODE_NONINTERLACED, 0 }
|
||||
};
|
||||
|
||||
static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size)
|
||||
{
|
||||
if (olpc_has_dcon()) {
|
||||
*modedb = (struct fb_videomode *) olpc_dcon_modedb;
|
||||
*size = ARRAY_SIZE(olpc_dcon_modedb);
|
||||
} else {
|
||||
*modedb = (struct fb_videomode *) geode_modedb;
|
||||
*size = ARRAY_SIZE(geode_modedb);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size)
|
||||
{
|
||||
*modedb = (struct fb_videomode *) geode_modedb;
|
||||
*size = ARRAY_SIZE(geode_modedb);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int lxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||
{
|
||||
if (var->xres > 1920 || var->yres > 1440)
|
||||
|
@ -477,7 +506,7 @@ static int __init lxfb_probe(struct pci_dev *pdev,
|
|||
int ret;
|
||||
|
||||
struct fb_videomode *modedb_ptr;
|
||||
int modedb_size;
|
||||
unsigned int modedb_size;
|
||||
|
||||
info = lxfb_init_fbinfo(&pdev->dev);
|
||||
|
||||
|
@ -502,9 +531,7 @@ static int __init lxfb_probe(struct pci_dev *pdev,
|
|||
|
||||
/* Set up the mode database */
|
||||
|
||||
modedb_ptr = (struct fb_videomode *) geode_modedb;
|
||||
modedb_size = ARRAY_SIZE(geode_modedb);
|
||||
|
||||
get_modedb(&modedb_ptr, &modedb_size);
|
||||
ret = fb_find_mode(&info->var, info, mode_option,
|
||||
modedb_ptr, modedb_size, NULL, 16);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user