patch-2.2.17 linux/drivers/video/fbmem.c
Next file: linux/drivers/video/igafb.c
Previous file: linux/drivers/video/fbcon.c
Back to the patch index
Back to the overall index
- Lines: 115
- Date:
Mon Sep 4 18:39:22 2000
- Orig file:
v2.2.16/drivers/video/fbmem.c
- Orig date:
Mon Sep 4 18:37:41 2000
diff -u --recursive --new-file v2.2.16/drivers/video/fbmem.c linux/drivers/video/fbmem.c
@@ -68,6 +68,8 @@
extern void offb_setup(char *options, int *ints);
extern void atyfb_init(void);
extern void atyfb_setup(char *options, int *ints);
+extern void aty128fb_init(void);
+extern void aty128fb_setup(char *options, int *ints);
extern void igafb_init(void);
extern void igafb_setup(char *options, int *ints);
extern void imsttfb_init(void);
@@ -92,6 +94,8 @@
extern void sbusfb_setup(char *options, int *ints);
extern void valkyriefb_init(void);
extern void valkyriefb_setup(char *options, int *ints);
+extern void control_init(void);
+extern void control_setup(char *options, int *ints);
extern void g364fb_init(void);
extern void fm2fb_init(void);
extern void fm2fb_setup(char *options, int *ints);
@@ -143,6 +147,9 @@
#ifdef CONFIG_FB_ATY
{ "atyfb", atyfb_init, atyfb_setup },
#endif
+#ifdef CONFIG_FB_ATY128
+ { "aty128fb", aty128fb_init, aty128fb_setup },
+#endif
#ifdef CONFIG_FB_IGA
{ "igafb", igafb_init, igafb_setup },
#endif
@@ -179,6 +186,9 @@
#ifdef CONFIG_FB_VALKYRIE
{ "valkyriefb", valkyriefb_init, valkyriefb_setup },
#endif
+#ifdef CONFIG_FB_CONTROL
+ { "controlfb", control_init, control_setup },
+#endif
#ifdef CONFIG_FB_G364
{ "g364", g364fb_init, NULL },
#endif
@@ -260,19 +270,27 @@
struct fb_info *info = registered_fb[fbidx];
struct fb_ops *fb = info->fbops;
struct fb_fix_screeninfo fix;
- char *base_addr;
- ssize_t copy_size;
if (! fb || ! info->disp)
return -ENODEV;
fb->fb_get_fix(&fix,PROC_CONSOLE(info), info);
- base_addr=info->disp->screen_base;
- copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p);
- if (copy_to_user(buf, base_addr+p, copy_size))
- return -EFAULT;
- *ppos += copy_size;
- return copy_size;
+ if (p >= fix.smem_len)
+ return 0;
+ if (count >= fix.smem_len)
+ count = fix.smem_len;
+ if (count + p > fix.smem_len)
+ count = fix.smem_len - p;
+ if (count) {
+ char *base_addr;
+
+ base_addr = info->disp->screen_base;
+ count -= copy_to_user(buf, base_addr+p, count);
+ if (!count)
+ return -EFAULT;
+ *ppos += count;
+ }
+ return count;
}
static ssize_t
@@ -284,19 +302,32 @@
struct fb_info *info = registered_fb[fbidx];
struct fb_ops *fb = info->fbops;
struct fb_fix_screeninfo fix;
- char *base_addr;
- ssize_t copy_size;
+ int err;
if (! fb || ! info->disp)
return -ENODEV;
fb->fb_get_fix(&fix, PROC_CONSOLE(info), info);
- base_addr=info->disp->screen_base;
- copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p);
- if (copy_from_user(base_addr+p, buf, copy_size))
- return -EFAULT;
- file->f_pos += copy_size;
- return copy_size;
+ if (p > fix.smem_len)
+ return -ENOSPC;
+ if (count >= fix.smem_len)
+ count = fix.smem_len;
+ err = 0;
+ if (count + p > fix.smem_len) {
+ count = fix.smem_len - p;
+ err = -ENOSPC;
+ }
+ if (count) {
+ char *base_addr;
+
+ base_addr = info->disp->screen_base;
+ count -= copy_from_user(base_addr+p, buf, count);
+ *ppos += count;
+ err = -EFAULT;
+ }
+ if (count)
+ return count;
+ return err;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)