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

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)