Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a976ff74 authored by Helge Deller's avatar Helge Deller Committed by Greg Kroah-Hartman
Browse files

fbdev: stifb: Provide valid pixelclock and add fb_check_var() checks



commit 203873a535d627c668f293be0cb73e26c30f9cc7 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: default avatarHelge Deller <deller@gmx.de>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ac58b88c
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -921,6 +921,28 @@ SETUP_HCRX(struct stifb_info *fb)

/* ------------------- 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
stifb_setcolreg(u_int regno, u_int red, u_int green,
	      u_int blue, u_int transp, struct fb_info *info)
@@ -1103,6 +1125,7 @@ stifb_init_display(struct stifb_info *fb)

static struct fb_ops stifb_ops = {
	.owner		= THIS_MODULE,
	.fb_check_var	= stifb_check_var,
	.fb_setcolreg	= stifb_setcolreg,
	.fb_blank	= stifb_blank,
	.fb_fillrect	= cfb_fillrect,
@@ -1122,6 +1145,7 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
	struct stifb_info *fb;
	struct fb_info *info;
	unsigned long sti_rom_address;
	char modestr[32];
	char *dev_name;
	int bpp, xres, yres;

@@ -1300,6 +1324,9 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
	info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_COPYAREA;
	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 !!! */
	if (fb_alloc_cmap(&info->cmap, NR_PALETTE, 0))
		goto out_err1;