Skip to content

Commit

Permalink
viafb: introduce strict parameter checking
Browse files Browse the repository at this point in the history
Refuse to work if wrong parameters are given.  This should improve the
user experience as it will be clear that something is wrong and not
silently ignored.

Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
Cc: Scott Fang <ScottFang@viatech.com.cn>
Cc: Joseph Chan <JosephChan@via.com.tw>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Florian Tobias Schandinat authored and Linus Torvalds committed Mar 12, 2010
1 parent 5c9443e commit fe9aab8
Showing 1 changed file with 38 additions and 29 deletions.
67 changes: 38 additions & 29 deletions drivers/video/via/viafbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,13 @@ static char *viafb_name = "Via";
static u32 pseudo_pal[17];

/* video mode */
static char *viafb_mode = "640x480";
static char *viafb_mode1 = "640x480";
static char *viafb_mode;
static char *viafb_mode1;

static int viafb_accel = 1;

/* Added for specifying active devices.*/
char *viafb_active_dev = "";
char *viafb_active_dev;

/*Added for specify lcd output port*/
char *viafb_lcd_port = "";
Expand Down Expand Up @@ -1327,7 +1327,7 @@ static void retrieve_device_setting(struct viafb_ioctl_setting
setting_info->lcd_attributes.lcd_mode = viafb_lcd_mode;
}

static void parse_active_dev(void)
static int parse_active_dev(void)
{
viafb_CRT_ON = STATE_OFF;
viafb_DVI_ON = STATE_OFF;
Expand All @@ -1338,60 +1338,63 @@ static void parse_active_dev(void)
IGA path to devices in SAMM case. */
/* Note: The previous of active_dev is primary device,
and the following is secondary device. */
if (!strncmp(viafb_active_dev, "CRT+DVI", 7)) {
if (!viafb_active_dev) {
viafb_CRT_ON = STATE_ON;
viafb_SAMM_ON = STATE_OFF;
} else if (!strcmp(viafb_active_dev, "CRT+DVI")) {
/* CRT+DVI */
viafb_CRT_ON = STATE_ON;
viafb_DVI_ON = STATE_ON;
viafb_primary_dev = CRT_Device;
} else if (!strncmp(viafb_active_dev, "DVI+CRT", 7)) {
} else if (!strcmp(viafb_active_dev, "DVI+CRT")) {
/* DVI+CRT */
viafb_CRT_ON = STATE_ON;
viafb_DVI_ON = STATE_ON;
viafb_primary_dev = DVI_Device;
} else if (!strncmp(viafb_active_dev, "CRT+LCD", 7)) {
} else if (!strcmp(viafb_active_dev, "CRT+LCD")) {
/* CRT+LCD */
viafb_CRT_ON = STATE_ON;
viafb_LCD_ON = STATE_ON;
viafb_primary_dev = CRT_Device;
} else if (!strncmp(viafb_active_dev, "LCD+CRT", 7)) {
} else if (!strcmp(viafb_active_dev, "LCD+CRT")) {
/* LCD+CRT */
viafb_CRT_ON = STATE_ON;
viafb_LCD_ON = STATE_ON;
viafb_primary_dev = LCD_Device;
} else if (!strncmp(viafb_active_dev, "DVI+LCD", 7)) {
} else if (!strcmp(viafb_active_dev, "DVI+LCD")) {
/* DVI+LCD */
viafb_DVI_ON = STATE_ON;
viafb_LCD_ON = STATE_ON;
viafb_primary_dev = DVI_Device;
} else if (!strncmp(viafb_active_dev, "LCD+DVI", 7)) {
} else if (!strcmp(viafb_active_dev, "LCD+DVI")) {
/* LCD+DVI */
viafb_DVI_ON = STATE_ON;
viafb_LCD_ON = STATE_ON;
viafb_primary_dev = LCD_Device;
} else if (!strncmp(viafb_active_dev, "LCD+LCD2", 8)) {
} else if (!strcmp(viafb_active_dev, "LCD+LCD2")) {
viafb_LCD_ON = STATE_ON;
viafb_LCD2_ON = STATE_ON;
viafb_primary_dev = LCD_Device;
} else if (!strncmp(viafb_active_dev, "LCD2+LCD", 8)) {
} else if (!strcmp(viafb_active_dev, "LCD2+LCD")) {
viafb_LCD_ON = STATE_ON;
viafb_LCD2_ON = STATE_ON;
viafb_primary_dev = LCD2_Device;
} else if (!strncmp(viafb_active_dev, "CRT", 3)) {
} else if (!strcmp(viafb_active_dev, "CRT")) {
/* CRT only */
viafb_CRT_ON = STATE_ON;
viafb_SAMM_ON = STATE_OFF;
} else if (!strncmp(viafb_active_dev, "DVI", 3)) {
} else if (!strcmp(viafb_active_dev, "DVI")) {
/* DVI only */
viafb_DVI_ON = STATE_ON;
viafb_SAMM_ON = STATE_OFF;
} else if (!strncmp(viafb_active_dev, "LCD", 3)) {
} else if (!strcmp(viafb_active_dev, "LCD")) {
/* LCD only */
viafb_LCD_ON = STATE_ON;
viafb_SAMM_ON = STATE_OFF;
} else {
viafb_CRT_ON = STATE_ON;
viafb_SAMM_ON = STATE_OFF;
}
} else
return -EINVAL;

return 0;
}

static int parse_port(char *opt_str, int *output_interface)
Expand Down Expand Up @@ -1820,24 +1823,25 @@ static void viafb_remove_proc(struct proc_dir_entry *viafb_entry)
remove_proc_entry("viafb", NULL);
}

static void parse_mode(const char *str, u32 *xres, u32 *yres)
static int parse_mode(const char *str, u32 *xres, u32 *yres)
{
char *ptr;

if (!str) {
*xres = 640;
*yres = 480;
return 0;
}

*xres = simple_strtoul(str, &ptr, 10);
if (ptr[0] != 'x')
goto out_default;
return -EINVAL;

*yres = simple_strtoul(&ptr[1], &ptr, 10);
if (ptr[0])
goto out_default;

return;
return -EINVAL;

out_default:
printk(KERN_WARNING "viafb received invalid mode string: %s\n", str);
*xres = 640;
*yres = 480;
return 0;
}

static int __devinit via_pci_probe(struct pci_dev *pdev,
Expand Down Expand Up @@ -1874,7 +1878,6 @@ static int __devinit via_pci_probe(struct pci_dev *pdev,

if (viafb_dual_fb)
viafb_SAMM_ON = 1;
parse_active_dev();
parse_lcd_port();
parse_dvi_port();

Expand Down Expand Up @@ -2192,12 +2195,18 @@ static struct pci_driver viafb_driver = {

static int __init viafb_init(void)
{
u32 dummy;
#ifndef MODULE
char *option = NULL;
if (fb_get_options("viafb", &option))
return -ENODEV;
viafb_setup(option);
#endif
if (parse_mode(viafb_mode, &dummy, &dummy)
|| parse_mode(viafb_mode1, &dummy, &dummy)
|| parse_active_dev())
return -EINVAL;

printk(KERN_INFO
"VIA Graphics Intergration Chipset framebuffer %d.%d initializing\n",
VERSION_MAJOR, VERSION_MINOR);
Expand Down

0 comments on commit fe9aab8

Please sign in to comment.