summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2011-08-17 17:07:23 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2011-08-19 01:56:51 +0200
commit1f60ac234b20b2eb7bc2b4b2cee8519aea6297ec (patch)
treeea4fa86439fe64e654088108ed5897f7df443405
parent4b6c5d0d72be26eeb340f25d0286d5e9561f85fa (diff)
Update fixed screen info after changing format or resolution
The line length field can change after changing the format or the resolution. Re-read fixed screen info from the device. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--fbdev.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/fbdev.c b/fbdev.c
index 205ab3c..578e67a 100644
--- a/fbdev.c
+++ b/fbdev.c
@@ -316,6 +316,25 @@ static void fb_unmap_memory(struct device *dev)
* Open/close
*/
+static int fb_update_info(struct device *dev)
+{
+ int ret;
+
+ ret = ioctl(dev->fd, FBIOGET_FSCREENINFO, &dev->fix_info);
+ if (ret < 0) {
+ printf("Error updating fixed screen info.\n");
+ return ret;
+ }
+
+ ret = ioctl(dev->fd, FBIOGET_VSCREENINFO, &dev->var_info);
+ if (ret < 0) {
+ printf("Error updating variable screen info.\n");
+ return ret;
+ }
+
+ return 0;
+}
+
/*
* fb_open - Open a frame buffer device
* @dev: FB device
@@ -338,18 +357,10 @@ static int fb_open(struct device *dev, const char *devname)
return dev->fd;
}
- ret = ioctl(dev->fd, FBIOGET_FSCREENINFO, &dev->fix_info);
- if (ret < 0) {
- printf("Error opening device %s: unable to get fixed screen "
- "info.\n", devname);
- close(dev->fd);
- return ret;
- }
-
- ret = ioctl(dev->fd, FBIOGET_VSCREENINFO, &dev->var_info);
+ ret = fb_update_info(dev);
if (ret < 0) {
- printf("Error opening device %s: unable to get variable screen "
- "info.\n", devname);
+ printf("Error opening device %s: unable to get screen info.\n",
+ devname);
close(dev->fd);
return ret;
}
@@ -497,6 +508,9 @@ static int fb_set_format(struct device *dev, unsigned int bpp)
fb_print_var(dev, &var_info);
+ /* Fixed screen information might have changed, re-read it. */
+ fb_update_info(dev);
+
return 0;
}
@@ -552,6 +566,9 @@ static int fb_set_resolution(struct device *dev, int xres, int yres,
fb_print_var(dev, &var_info);
+ /* Fixed screen information might have changed, re-read it. */
+ fb_update_info(dev);
+
return 0;
}