patch-2.1.115 linux/drivers/sbus/char/sunfb.c
Next file: linux/drivers/sbus/char/sunkbd.c
Previous file: linux/drivers/sbus/char/suncons_font.h
Back to the patch index
Back to the overall index
- Lines: 320
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.1.114/linux/drivers/sbus/char/sunfb.c
- Orig date:
Mon Jan 12 15:15:45 1998
diff -u --recursive --new-file v2.1.114/linux/drivers/sbus/char/sunfb.c linux/drivers/sbus/char/sunfb.c
@@ -1,319 +0,0 @@
-/* $Id: sunfb.c,v 1.29 1997/09/20 20:47:26 davem Exp $
- * sunfb.c: Sun generic frame buffer support.
- *
- * Copyright (C) 1995, 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- *
- * Added getcmap ioctl, may, 96
- * Support for multiple fbs, sep, 96
- */
-
-#include <linux/sched.h>
-#include <linux/timer.h>
-#include <linux/interrupt.h>
-#include <linux/tty.h>
-#include <linux/tty_flip.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/kd.h>
-#include <linux/malloc.h>
-#include <linux/major.h>
-#include <linux/mm.h>
-#include <linux/types.h>
-#include <linux/proc_fs.h>
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/bitops.h>
-#include <asm/oplib.h>
-#include <asm/sbus.h>
-#include <asm/fbio.h>
-#include <asm/io.h>
-
-#include <linux/kbd_kern.h>
-#include <linux/vt_kern.h>
-#include <linux/consolemap.h>
-#include <linux/selection.h>
-#include <linux/console_struct.h>
-
-#include "fb.h"
-
-extern void set_other_palette (int);
-extern void set_cursor (int);
-
-#define FB_SETUP(err) \
- int minor = FB_DEV (file->f_dentry->d_inode->i_rdev); \
-\
- if (minor >= fbinfos || \
- fbinfo [minor].type.fb_type == FBTYPE_NOTYPE) \
- return -(err);
-
-static int
-fb_open (struct inode * inode, struct file * file)
-{
- FB_SETUP(EBADF)
- if (fbinfo [minor].open)
- return -EBUSY;
- fbinfo [minor].mmaped = 0;
- fbinfo [minor].open = 1;
- return 0;
-}
-
-static int
-fb_ioctl (struct inode *inode, struct file *file, uint cmd, unsigned long arg)
-{
- fbinfo_t *fb;
- struct fbcmap *cmap;
- int i;
- FB_SETUP(EBADF)
-
- fb = &fbinfo [minor];
-
- switch (cmd){
- case FBIOGTYPE: /* return frame buffer type */
- copy_to_user_ret((struct fbtype *)arg, &fb->type, sizeof(struct fbtype), -EFAULT);
- break;
- case FBIOGATTR:{
- struct fbgattr *fba = (struct fbgattr *) arg;
-
- i = verify_area (VERIFY_WRITE, (void *) arg, sizeof (struct fbgattr));
- if (i) return i;
- __put_user_ret(fb->real_type, &fba->real_type, -EFAULT);
- __put_user_ret(0, &fba->owner, -EFAULT);
- __copy_to_user_ret(&fba->fbtype, &fb->type,
- sizeof(struct fbtype), -EFAULT);
- __put_user_ret(0, &fba->sattr.flags, -EFAULT);
- __put_user_ret(fb->type.fb_type, &fba->sattr.emu_type, -EFAULT);
- __put_user_ret(-1, &fba->sattr.dev_specific[0], -EFAULT);
- __put_user_ret(fb->type.fb_type, &fba->emu_types[0], -EFAULT);
- for (i = 1; i < 4; i++)
- put_user_ret(fb->emulations[i], &fba->emu_types[i], -EFAULT);
- break;
- }
- case FBIOSATTR:
- i = verify_area (VERIFY_READ, (void *) arg, sizeof (struct fbsattr));
- if (i) return i;
- return -EINVAL;
- case FBIOSVIDEO:
- if (fb == fbinfo && vt_cons[fg_console]->vc_mode == KD_TEXT)
- break;
- get_user_ret(i, (int *)arg, -EFAULT);
- if (i){
- if (!fb->blanked || !fb->unblank)
- break;
- if (!minor || (fb->open && fb->mmaped))
- (*fb->unblank)(fb);
- fb->blanked = 0;
- } else {
- if (fb->blanked || !fb->blank)
- break;
- (*fb->blank)(fb);
- fb->blanked = 1;
- }
- break;
- case FBIOGVIDEO:
- put_user_ret(fb->blanked, (int *) arg, -EFAULT);
- break;
- case FBIOGETCMAP: {
- char *rp, *gp, *bp;
- int end, count, index;
-
- if (!fb->loadcmap)
- return -EINVAL;
- i = verify_area (VERIFY_READ, (void *) arg, sizeof (struct fbcmap));
- if (i) return i;
- cmap = (struct fbcmap *) arg;
- __get_user_ret(count, &cmap->count, -EFAULT);
- __get_user_ret(index, &cmap->index, -EFAULT);
- if ((index < 0) || (index > 255))
- return -EINVAL;
- if (index + count > 256)
- count = 256 - index;
- __get_user_ret(rp, &cmap->red, -EFAULT);
- __get_user_ret(gp, &cmap->green, -EFAULT);
- __get_user_ret(bp, &cmap->blue, -EFAULT);
- if(verify_area (VERIFY_WRITE, rp, count)) return -EFAULT;
- if(verify_area (VERIFY_WRITE, gp, count)) return -EFAULT;
- if(verify_area (VERIFY_WRITE, bp, count)) return -EFAULT;
- end = index + count;
- for (i = index; i < end; i++){
- __put_user_ret(fb->color_map CM(i,0), rp, -EFAULT);
- __put_user_ret(fb->color_map CM(i,1), gp, -EFAULT);
- __put_user_ret(fb->color_map CM(i,2), bp, -EFAULT);
- rp++; gp++; bp++;
- }
- (*fb->loadcmap)(fb, index, count);
- break;
-
- }
- case FBIOPUTCMAP: { /* load color map entries */
- char *rp, *gp, *bp;
- int end, count, index;
-
- if (!fb->loadcmap)
- return -EINVAL;
- i = verify_area (VERIFY_READ, (void *) arg, sizeof (struct fbcmap));
- if (i) return i;
- cmap = (struct fbcmap *) arg;
- __get_user_ret(count, &cmap->count, -EFAULT);
- __get_user_ret(index, &cmap->index, -EFAULT);
- if ((index < 0) || (index > 255))
- return -EINVAL;
- if (index + count > 256)
- count = 256 - index;
- __get_user_ret(rp, &cmap->red, -EFAULT);
- __get_user_ret(gp, &cmap->green, -EFAULT);
- __get_user_ret(bp, &cmap->blue, -EFAULT);
- if(verify_area (VERIFY_READ, rp, count)) return -EFAULT;
- if(verify_area (VERIFY_READ, gp, count)) return -EFAULT;
- if(verify_area (VERIFY_READ, bp, count)) return -EFAULT;
-
- end = index + count;
- for (i = index; i < end; i++){
- __get_user_ret(fb->color_map CM(i,0), rp, -EFAULT);
- __get_user_ret(fb->color_map CM(i,1), gp, -EFAULT);
- __get_user_ret(fb->color_map CM(i,2), bp, -EFAULT);
- rp++; gp++; bp++;
- }
- (*fb->loadcmap)(fb, index, count);
- break;
- }
-
- case FBIOGCURMAX: {
- struct fbcurpos *p = (struct fbcurpos *) arg;
- if (!fb->setcursor) return -EINVAL;
- if(verify_area (VERIFY_WRITE, p, sizeof (struct fbcurpos)))
- return -EFAULT;
- __put_user_ret(fb->cursor.hwsize.fbx, &p->fbx, -EFAULT);
- __put_user_ret(fb->cursor.hwsize.fby, &p->fby, -EFAULT);
- break;
- }
- case FBIOSCURSOR:
- if (!fb->setcursor) return -EINVAL;
- if (fb == fbinfo) {
- if (vt_cons[fg_console]->vc_mode == KD_TEXT)
- return -EINVAL; /* Don't let graphics programs hide our nice text cursor */
- sbus_hw_cursor_shown = 0; /* Forget state of our text cursor */
- }
- return sbus_hw_scursor ((struct fbcursor *) arg, fb);
-
- case FBIOSCURPOS:
- if (!fb->setcursor) return -EINVAL;
- /* Don't let graphics programs move our nice text cursor */
- if (fb == fbinfo) {
- if (vt_cons[fg_console]->vc_mode == KD_TEXT)
- return -EINVAL; /* Don't let graphics programs move our nice text cursor */
- }
- i= verify_area (VERIFY_READ, (void *) arg, sizeof (struct fbcurpos));
- if (i) return i;
- fb->cursor.cpos = *(struct fbcurpos *)arg;
- (*fb->setcursor) (fb);
- break;
-
- default:
- if (fb->ioctl){
- i = fb->ioctl (inode, file, cmd, arg, fb);
- if (i == -ENOSYS) {
- printk ("[[FBIO: %8.8x]]\n", cmd);
- return -EINVAL;
- }
- return i;
- }
- printk ("[[FBIO: %8.8x]]\n", cmd);
- return -EINVAL;
- }
- return 0;
-}
-
-static int
-fb_close (struct inode * inode, struct file *file)
-{
- fbinfo_t *fb;
- struct fbcursor cursor;
- FB_SETUP(EBADF)
-
- fb = &fbinfo[minor];
-
- if (!minor)
- vt_cons [fb->vtconsole]->vc_mode = KD_TEXT;
-
- /* Leaving graphics mode, turn off the cursor */
- if (fb->mmaped) {
- fb->clear_fb (minor);
- if (!minor && suncons_ops.clear_margin)
- suncons_ops.clear_margin();
- }
- cursor.set = FB_CUR_SETCUR;
- cursor.enable = 0;
-
- /* Reset the driver */
- if (fb->reset)
- fb->reset(fb);
-
- if (fb->open)
- fb->open = 0;
- fb_ioctl (inode, file, FBIOSCURPOS, (unsigned long) &cursor);
- set_other_palette (minor);
- if (!minor) {
- render_screen ();
- set_cursor (fg_console);
- } else if (fb->blank)
- (*fb->blank)(fb);
- return 0;
-}
-
-static int
-fb_mmap (struct file *file, struct vm_area_struct *vma)
-{
- fbinfo_t *fb;
- FB_SETUP(ENXIO)
-
- fb = &fbinfo [minor];
-
- if (fb->mmap){
- int v;
-
- v = (*fb->mmap)(file->f_dentry->d_inode, file, vma, fb->base, fb);
- if (v)
- return v;
- vma->vm_flags |= VM_IO;
- if (!fb->mmaped) {
- fb->mmaped = 1;
- if (!minor) {
- fb->vtconsole = fg_console;
- vt_cons [fg_console]->vc_mode = KD_GRAPHICS;
- } else {
- if (fb->unblank && !fb->blanked)
- (*fb->unblank)(fb);
- }
- }
- return 0;
- } else
- return -ENXIO;
-}
-
-static struct file_operations graphdev_fops =
-{
- NULL, /* lseek */
- NULL, /* read */
- NULL, /* write */
- NULL, /* readdir */
- NULL, /* poll */
- fb_ioctl,
- fb_mmap,
- fb_open, /* open */
- fb_close, /* close */
-};
-
-__initfunc(int fb_init (void))
-{
- /* Register the frame buffer device */
- if (register_chrdev (GRAPHDEV_MAJOR, "graphics", &graphdev_fops)){
- printk ("Could not register graphics device\n");
- return -EIO;
- }
- return 0; /* success */
-}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov