From 30aa4efb57475ff768f6d43051ee78160f32ce0f Mon Sep 17 00:00:00 2001 From: Juergen Beisert Date: Mon, 20 Dec 2010 16:05:05 +0100 Subject: [PATCH] Add the feature to change the video mode at runtime This patch add the possibility to change the video mode at barebox's runtime if the graphics driver in use supports it. Signed-off-by: Signed-off-by: Sascha Hauer --- drivers/video/fb.c | 35 +++++++++++++++++++++++++++++++++++ include/fb.h | 3 +++ 2 files changed, 38 insertions(+) diff --git a/drivers/video/fb.c b/drivers/video/fb.c index bef41470c..aad0e1f40 100644 --- a/drivers/video/fb.c +++ b/drivers/video/fb.c @@ -56,6 +56,35 @@ static int fb_enable_set(struct device_d *dev, struct param_d *param, 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 @@ int register_framebuffer(struct fb_info *info) 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 379f931e9..41deb8c69 100644 --- a/include/fb.h +++ b/include/fb.h @@ -73,10 +73,13 @@ struct fb_ops { 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 */