patch-2.4.0-test12 linux/drivers/video/stifb.c
Next file: linux/drivers/video/tdfxfb.c
Previous file: linux/drivers/video/sticore.c
Back to the patch index
Back to the overall index
- Lines: 231
- Date:
Tue Dec 5 12:29:39 2000
- Orig file:
v2.4.0-test11/linux/drivers/video/stifb.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.4.0-test11/linux/drivers/video/stifb.c linux/drivers/video/stifb.c
@@ -0,0 +1,230 @@
+/*
+ * linux/drivers/video/stifb.c - Generic frame buffer driver for HP
+ * workstations with STI (standard text interface) video firmware.
+ *
+ * Based on:
+ * linux/drivers/video/artistfb.c -- Artist frame buffer driver
+ *
+ * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
+ *
+ * based on skeletonfb, which was
+ * Created 28 Dec 1997 by Geert Uytterhoeven
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of this archive
+ * for more details. */
+
+/*
+ * Notes:
+ *
+ * This driver assumes that the video has been set up in 1bpp mode by
+ * the firmware. Since HP video tends to be planar rather than
+ * packed-pixel this will probably work anyway even if it isn't.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/malloc.h>
+#include <linux/delay.h>
+#include <linux/fb.h>
+#include <linux/init.h>
+
+#include <video/fbcon.h>
+
+#include "sti.h"
+
+static struct fb_ops stifb_ops;
+
+struct stifb_info {
+ struct fb_info_gen gen;
+ struct sti_struct *sti;
+};
+
+struct stifb_par {
+};
+
+static struct stifb_info fb_info;
+static struct display disp;
+
+int stifb_init(void);
+int stifb_setup(char*);
+
+extern struct display_switch fbcon_sti;
+
+/* ------------------- chipset specific functions -------------------------- */
+
+static int
+sti_encode_fix(struct fb_fix_screeninfo *fix,
+ const void *par, struct fb_info_gen *info)
+{
+ /* XXX: what about smem_len? */
+ fix->smem_start = PTR_STI(fb_info.sti->glob_cfg)->region_ptrs[1];
+ fix->type = FB_TYPE_PLANES; /* well, sort of */
+
+ return 0;
+}
+
+static int
+sti_decode_var(const struct fb_var_screeninfo *var,
+ void *par, struct fb_info_gen *info)
+{
+ return 0;
+}
+
+static int
+sti_encode_var(struct fb_var_screeninfo *var,
+ const void *par, struct fb_info_gen *info)
+{
+ var->xres = PTR_STI(fb_info.sti->glob_cfg)->onscreen_x;
+ var->yres = PTR_STI(fb_info.sti->glob_cfg)->onscreen_y;
+ var->xres_virtual = PTR_STI(fb_info.sti->glob_cfg)->total_x;
+ var->yres_virtual = PTR_STI(fb_info.sti->glob_cfg)->total_y;
+ var->xoffset = var->yoffset = 0;
+
+ var->bits_per_pixel = 1;
+ var->grayscale = 0;
+
+ return 0;
+}
+
+static void
+sti_get_par(void *par, struct fb_info_gen *info)
+{
+}
+
+static void
+sti_set_par(const void *par, struct fb_info_gen *info)
+{
+}
+
+static int
+sti_getcolreg(unsigned regno, unsigned *red, unsigned *green,
+ unsigned *blue, unsigned *transp, struct fb_info *info)
+{
+ return 0;
+}
+
+static int
+sti_setcolreg(unsigned regno, unsigned red, unsigned green,
+ unsigned blue, unsigned transp, struct fb_info *info)
+{
+ return 0;
+}
+
+static void
+sti_set_disp(const void *par, struct display *disp,
+ struct fb_info_gen *info)
+{
+ disp->screen_base =
+ (void *) PTR_STI(fb_info.sti->glob_cfg)->region_ptrs[1];
+ disp->dispsw = &fbcon_sti;
+}
+
+static void
+sti_detect(void)
+{
+}
+
+static int
+sti_blank(int blank_mode, const struct fb_info *info)
+{
+ return 0;
+}
+
+/* ------------ Interfaces to hardware functions ------------ */
+
+struct fbgen_hwswitch sti_switch = {
+ detect: sti_detect,
+ encode_fix: sti_encode_fix,
+ decode_var: sti_decode_var,
+ encode_var: sti_encode_var,
+ get_par: sti_get_par,
+ set_par: sti_set_par,
+ getcolreg: sti_getcolreg,
+ setcolreg: sti_setcolreg,
+ pan_display: NULL,
+ blank: sti_blank,
+ set_disp: sti_set_disp
+};
+
+
+/* ------------ Hardware Independent Functions ------------ */
+
+ /*
+ * Initialization
+ */
+
+int __init
+stifb_init(void)
+{
+ printk("searching for word mode STI ROMs\n");
+ /* XXX: in the future this will return a list of ROMs */
+ if ((fb_info.sti = sti_init_roms()) == NULL)
+ return -ENXIO;
+
+ fb_info.gen.info.node = -1;
+ fb_info.gen.info.flags = FBINFO_FLAG_DEFAULT;
+ fb_info.gen.info.fbops = &stifb_ops;
+ fb_info.gen.info.disp = &disp;
+ fb_info.gen.info.changevar = NULL;
+ fb_info.gen.info.switch_con = &fbgen_switch;
+ fb_info.gen.info.updatevar = &fbgen_update_var;
+ fb_info.gen.info.blank = &fbgen_blank;
+ strcpy(fb_info.gen.info.modename, "STI Generic");
+ fb_info.gen.fbhw = &sti_switch;
+ fb_info.gen.fbhw->detect();
+
+ /* This should give a reasonable default video mode */
+ fbgen_get_var(&disp.var, -1, &fb_info.gen.info);
+ fbgen_do_set_var(&disp.var, 1, &fb_info.gen);
+ fbgen_set_disp(-1, &fb_info.gen);
+ fbgen_install_cmap(0, &fb_info.gen);
+ pdc_console_die();
+ if (register_framebuffer(&fb_info.gen.info) < 0)
+ return -EINVAL;
+
+ printk(KERN_INFO "fb%d: %s frame buffer device\n",
+ GET_FB_IDX(fb_info.gen.info.node), fb_info.gen.info.modename);
+
+ return 0;
+}
+
+
+ /*
+ * Cleanup
+ */
+
+void
+stifb_cleanup(struct fb_info *info)
+{
+ printk("stifb_cleanup: you're on crack\n");
+}
+
+
+int __init
+stifb_setup(char *options)
+{
+ /* XXX: we should take the resolution, bpp as command line arguments. */
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------- */
+
+
+static struct fb_ops stifb_ops = {
+ owner: THIS_MODULE,
+ fb_open: NULL,
+ fb_release: NULL,
+ fb_get_fix: fbgen_get_fix,
+ fb_get_var: fbgen_get_var,
+ fb_set_var: fbgen_set_var,
+ fb_get_cmap: fbgen_get_cmap,
+ fb_set_cmap: fbgen_set_cmap,
+ fb_pan_display: fbgen_pan_display,
+ fb_ioctl: NULL
+};
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)