diff --git a/drivers/video/fb.c b/drivers/video/fb.c index bef4147..aad0e1f 100644 --- a/drivers/video/fb.c +++ b/drivers/video/fb.c @@ -56,6 +56,35 @@ return 0; } +static int fb_setup_mode(struct device_d *dev, struct param_d *param, + const char *val) +{ + struct fb_info *info = dev->priv; + int mode, ret; + + if (info->enabled != 0) + return -EPERM; + + if (!val) + return dev_param_set_generic(dev, param, NULL); + + for (mode = 0; mode < info->num_modes; mode++) { + if (!strcmp(info->mode_list[mode].name, val)) + break; + } + if (mode >= info->num_modes) + return -EINVAL; + + info->mode = &info->mode_list[mode]; + + ret = info->fbops->fb_activate_var(info); + + if (ret == 0) + dev_param_set_generic(dev, param, val); + + return ret; +} + static struct file_operations fb_ops = { .read = mem_read, .write = mem_write, @@ -87,6 +116,12 @@ dev_add_param(dev, "enable", fb_enable_set, NULL, 0); dev_set_param(dev, "enable", "0"); + if (info->num_modes && (info->mode_list != NULL) && + (info->fbops->fb_activate_var != NULL)) { + dev_add_param(dev, "mode_name", fb_setup_mode, NULL, 0); + dev_set_param(dev, "mode_name", info->mode_list[0].name); + } + devfs_create(&info->cdev); return 0; diff --git a/include/fb.h b/include/fb.h index 379f931..41deb8c 100644 --- a/include/fb.h +++ b/include/fb.h @@ -73,10 +73,13 @@ unsigned blue, unsigned transp, struct fb_info *info); void (*fb_enable)(struct fb_info *info); void (*fb_disable)(struct fb_info *info); + int (*fb_activate_var)(struct fb_info *info); }; struct fb_info { struct fb_videomode *mode; + struct fb_videomode *mode_list; + unsigned num_modes; struct fb_ops *fbops; struct device_d dev; /* This is this fb device */