UDLFB: Add module_param to allow forcing pixel_limit

From: Ben Collins
Date: Thu Feb 16 2012 - 17:00:59 EST


Some devices may have bad vendor descriptors. This allows the user to set
a pixel limit that matches their specific device. The default was the
maximum (DL-195) which allowed bad modes to be set for lower level
devices (DL-115, etc).

Optionally, I considered setting the default pixel_limit to 700000
(DL-115), but figured this was OK instead.

Signed-off-by: Ben Collins <bcollins@xxxxxxxxxx>

diff --git a/drivers/video/udlfb.c b/drivers/video/udlfb.c
index 0319593..debb029 100644
--- a/drivers/video/udlfb.c
+++ b/drivers/video/udlfb.c
@@ -72,6 +72,7 @@ MODULE_DEVICE_TABLE(usb, id_table);
static bool console = 1; /* Allow fbcon to open framebuffer */
static bool fb_defio = 1; /* Detect mmap writes using page faults */
static bool shadow = 1; /* Optionally disable shadow framebuffer */
+static int pixel_limit; /* Optionally force a pixel limit (for bad vendor descriptors) */

/* dlfb keeps a list of urbs for efficient bulk transfers */
static void dlfb_urb_completion(struct urb *urb);
@@ -1546,9 +1547,15 @@ static int dlfb_parse_vendor_descriptor(struct dlfb_data *dev,
case 0x0200: { /* max_area */
u32 max_area;
max_area = le32_to_cpu(*((u32 *)desc));
- pr_warn("DL chip limited to %d pixel modes\n",
- max_area);
- dev->sku_pixel_limit = max_area;
+ if (!pixel_limit) {
+ pr_warn("DL chip limited to %d pixel"
+ " modes\n", max_area);
+ dev->sku_pixel_limit = max_area;
+ } else {
+ pr_warn("DL chip limit of %d overriden"
+ " by module param to %d\n",
+ max_area, pixel_limit);
+ }
break;
}
default:
@@ -1605,8 +1612,12 @@ static int dlfb_usb_probe(struct usb_interface *interface,
pr_info("console enable=%d\n", console);
pr_info("fb_defio enable=%d\n", fb_defio);
pr_info("shadow enable=%d\n", shadow);
+ pr_info("pixel_limit=%d\n", pixel_limit);

- dev->sku_pixel_limit = 2048 * 1152; /* default to maximum */
+ if (pixel_limit)
+ dev->sku_pixel_limit = pixel_limit;
+ else
+ dev->sku_pixel_limit = 2048 * 1152; /* default to maximum */

if (!dlfb_parse_vendor_descriptor(dev, interface)) {
pr_err("firmware not recognized. Assume incompatible device\n");
@@ -1948,6 +1959,9 @@ MODULE_PARM_DESC(fb_defio, "Page fault detection of mmap writes");
module_param(shadow, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
MODULE_PARM_DESC(shadow, "Shadow vid mem. Disable to save mem but lose perf");

+module_param(pixel_limit, int, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
+MODULE_PARM_DESC(pixel_limit, "Pixel limit (700000 minimum for DL-115, 2360000 maximum for DL-195)");
+
MODULE_AUTHOR("Roberto De Ioris <roberto@xxxxxxxx>, "
"Jaya Kumar <jayakumar.lkml@xxxxxxxxx>, "
"Bernie Thompson <bernie@xxxxxxxxxxxx>");

--
Bluecherry: http://www.bluecherrydvr.com/
SwissDisk : http://www.swissdisk.com/
Ubuntu : http://www.ubuntu.com/
My Blog : http://ben-collins.blogspot.com/

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/