Merge Linus' tree.
[safe/jmp/linux-2.6] / drivers / video / fbsysfs.c
index 63b505c..08dac95 100644 (file)
@@ -213,6 +213,70 @@ static ssize_t show_bpp(struct class_device *class_device, char *buf)
        return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->var.bits_per_pixel);
 }
 
+static ssize_t store_rotate(struct class_device *class_device, const char *buf,
+                           size_t count)
+{
+       struct fb_info *fb_info = class_get_devdata(class_device);
+       struct fb_var_screeninfo var;
+       char **last = NULL;
+       int err;
+
+       var = fb_info->var;
+       var.rotate = simple_strtoul(buf, last, 0);
+
+       if ((err = activate(fb_info, &var)))
+               return err;
+
+       return count;
+}
+
+
+static ssize_t show_rotate(struct class_device *class_device, char *buf)
+{
+       struct fb_info *fb_info = class_get_devdata(class_device);
+
+       return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->var.rotate);
+}
+
+static ssize_t store_con_rotate(struct class_device *class_device,
+                               const char *buf, size_t count)
+{
+       struct fb_info *fb_info = class_get_devdata(class_device);
+       int rotate;
+       char **last = NULL;
+
+       acquire_console_sem();
+       rotate = simple_strtoul(buf, last, 0);
+       fb_con_duit(fb_info, FB_EVENT_SET_CON_ROTATE, &rotate);
+       release_console_sem();
+       return count;
+}
+
+static ssize_t store_con_rotate_all(struct class_device *class_device,
+                               const char *buf, size_t count)
+{
+       struct fb_info *fb_info = class_get_devdata(class_device);
+       int rotate;
+       char **last = NULL;
+
+       acquire_console_sem();
+       rotate = simple_strtoul(buf, last, 0);
+       fb_con_duit(fb_info, FB_EVENT_SET_CON_ROTATE_ALL, &rotate);
+       release_console_sem();
+       return count;
+}
+
+static ssize_t show_con_rotate(struct class_device *class_device, char *buf)
+{
+       struct fb_info *fb_info = class_get_devdata(class_device);
+       int rotate;
+
+       acquire_console_sem();
+       rotate = fb_con_duit(fb_info, FB_EVENT_GET_CON_ROTATE, NULL);
+       release_console_sem();
+       return snprintf(buf, PAGE_SIZE, "%d\n", rotate);
+}
+
 static ssize_t store_virtual(struct class_device *class_device,
                             const char * buf, size_t count)
 {
@@ -242,17 +306,24 @@ static ssize_t show_virtual(struct class_device *class_device, char *buf)
                        fb_info->var.yres_virtual);
 }
 
+static ssize_t show_stride(struct class_device *class_device, char *buf)
+{
+       struct fb_info *fb_info =
+               (struct fb_info *)class_get_devdata(class_device);
+       return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->fix.line_length);
+}
+
 /* Format for cmap is "%02x%c%4x%4x%4x\n" */
 /* %02x entry %c transp %4x red %4x blue %4x green \n */
-/* 255 rows at 16 chars equals 4096 */
-/* PAGE_SIZE can be 4096 or larger */
+/* 256 rows at 16 chars equals 4096, the normal page size */
+/* the code will automatically adjust for different page sizes */
 static ssize_t store_cmap(struct class_device *class_device, const char *buf,
                          size_t count)
 {
        struct fb_info *fb_info = (struct fb_info *)class_get_devdata(class_device);
        int rc, i, start, length, transp = 0;
 
-       if ((count > 4096) || ((count % 16) != 0) || (PAGE_SIZE < 4096))
+       if ((count > PAGE_SIZE) || ((count % 16) != 0))
                return -EINVAL;
 
        if (!fb_info->fbops->fb_setcolreg && !fb_info->fbops->fb_setcmap)
@@ -317,18 +388,18 @@ static ssize_t show_cmap(struct class_device *class_device, char *buf)
           !fb_info->cmap.green)
                return -EINVAL;
 
-       if (PAGE_SIZE < 4096)
+       if (fb_info->cmap.len > PAGE_SIZE / 16)
                return -EINVAL;
 
        /* don't mess with the format, the buffer is PAGE_SIZE */
-       /* 255 entries at 16 chars per line equals 4096 = PAGE_SIZE */
+       /* 256 entries at 16 chars per line equals 4096 = PAGE_SIZE */
        for (i = 0; i < fb_info->cmap.len; i++) {
-               sprintf(&buf[ i * 16], "%02x%c%4x%4x%4x\n", i + fb_info->cmap.start,
+               snprintf(&buf[ i * 16], PAGE_SIZE - i * 16, "%02x%c%4x%4x%4x\n", i + fb_info->cmap.start,
                        ((fb_info->cmap.transp && fb_info->cmap.transp[i]) ? '*' : ' '),
                        fb_info->cmap.red[i], fb_info->cmap.blue[i],
                        fb_info->cmap.green[i]);
        }
-       return 4096;
+       return 16 * fb_info->cmap.len;
 }
 
 static ssize_t store_blank(struct class_device *class_device, const char * buf,
@@ -414,6 +485,13 @@ static ssize_t show_pan(struct class_device *class_device, char *buf)
                        fb_info->var.xoffset);
 }
 
+static ssize_t show_name(struct class_device *class_device, char *buf)
+{
+       struct fb_info *fb_info = (struct fb_info *)class_get_devdata(class_device);
+
+       return snprintf(buf, PAGE_SIZE, "%s\n", fb_info->fix.id);
+}
+
 static struct class_device_attribute class_device_attrs[] = {
        __ATTR(bits_per_pixel, S_IRUGO|S_IWUSR, show_bpp, store_bpp),
        __ATTR(blank, S_IRUGO|S_IWUSR, show_blank, store_blank),
@@ -424,6 +502,11 @@ static struct class_device_attribute class_device_attrs[] = {
        __ATTR(modes, S_IRUGO|S_IWUSR, show_modes, store_modes),
        __ATTR(pan, S_IRUGO|S_IWUSR, show_pan, store_pan),
        __ATTR(virtual_size, S_IRUGO|S_IWUSR, show_virtual, store_virtual),
+       __ATTR(name, S_IRUGO, show_name, NULL),
+       __ATTR(stride, S_IRUGO, show_stride, NULL),
+       __ATTR(rotate, S_IRUGO|S_IWUSR, show_rotate, store_rotate),
+       __ATTR(con_rotate, S_IRUGO|S_IWUSR, show_con_rotate, store_con_rotate),
+       __ATTR(con_rotate_all, S_IWUSR, NULL, store_con_rotate_all),
 };
 
 int fb_init_class_device(struct fb_info *fb_info)