fbdev: stifb: Provide valid pixelclock and add fb_check_var() checks
commit 203873a535
upstream.
Find a valid modeline depending on the machine graphic card
configuration and add the fb_check_var() function to validate
Xorg provided graphics settings.
Signed-off-by: Helge Deller <deller@gmx.de>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
0ad710a83d
commit
15f6110abd
|
@ -921,6 +921,28 @@ SETUP_HCRX(struct stifb_info *fb)
|
||||||
|
|
||||||
/* ------------------- driver specific functions --------------------------- */
|
/* ------------------- driver specific functions --------------------------- */
|
||||||
|
|
||||||
|
static int
|
||||||
|
stifb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||||
|
{
|
||||||
|
struct stifb_info *fb = container_of(info, struct stifb_info, info);
|
||||||
|
|
||||||
|
if (var->xres != fb->info.var.xres ||
|
||||||
|
var->yres != fb->info.var.yres ||
|
||||||
|
var->bits_per_pixel != fb->info.var.bits_per_pixel)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
var->xres_virtual = var->xres;
|
||||||
|
var->yres_virtual = var->yres;
|
||||||
|
var->xoffset = 0;
|
||||||
|
var->yoffset = 0;
|
||||||
|
var->grayscale = fb->info.var.grayscale;
|
||||||
|
var->red.length = fb->info.var.red.length;
|
||||||
|
var->green.length = fb->info.var.green.length;
|
||||||
|
var->blue.length = fb->info.var.blue.length;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
stifb_setcolreg(u_int regno, u_int red, u_int green,
|
stifb_setcolreg(u_int regno, u_int red, u_int green,
|
||||||
u_int blue, u_int transp, struct fb_info *info)
|
u_int blue, u_int transp, struct fb_info *info)
|
||||||
|
@ -1145,6 +1167,7 @@ stifb_init_display(struct stifb_info *fb)
|
||||||
|
|
||||||
static const struct fb_ops stifb_ops = {
|
static const struct fb_ops stifb_ops = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
|
.fb_check_var = stifb_check_var,
|
||||||
.fb_setcolreg = stifb_setcolreg,
|
.fb_setcolreg = stifb_setcolreg,
|
||||||
.fb_blank = stifb_blank,
|
.fb_blank = stifb_blank,
|
||||||
.fb_fillrect = stifb_fillrect,
|
.fb_fillrect = stifb_fillrect,
|
||||||
|
@ -1164,6 +1187,7 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
|
||||||
struct stifb_info *fb;
|
struct stifb_info *fb;
|
||||||
struct fb_info *info;
|
struct fb_info *info;
|
||||||
unsigned long sti_rom_address;
|
unsigned long sti_rom_address;
|
||||||
|
char modestr[32];
|
||||||
char *dev_name;
|
char *dev_name;
|
||||||
int bpp, xres, yres;
|
int bpp, xres, yres;
|
||||||
|
|
||||||
|
@ -1342,6 +1366,9 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
|
||||||
info->flags = FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT;
|
info->flags = FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT;
|
||||||
info->pseudo_palette = &fb->pseudo_palette;
|
info->pseudo_palette = &fb->pseudo_palette;
|
||||||
|
|
||||||
|
scnprintf(modestr, sizeof(modestr), "%dx%d-%d", xres, yres, bpp);
|
||||||
|
fb_find_mode(&info->var, info, modestr, NULL, 0, NULL, bpp);
|
||||||
|
|
||||||
/* This has to be done !!! */
|
/* This has to be done !!! */
|
||||||
if (fb_alloc_cmap(&info->cmap, NR_PALETTE, 0))
|
if (fb_alloc_cmap(&info->cmap, NR_PALETTE, 0))
|
||||||
goto out_err1;
|
goto out_err1;
|
||||||
|
|
Loading…
Reference in New Issue