/drivers/video/skeletonfb.c
C | 1041 lines | 281 code | 93 blank | 667 comment | 22 complexity | 4dcfad81f062776aed8a40a56f75419d MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
- /*
- * linux/drivers/video/skeletonfb.c -- Skeleton for a frame buffer device
- *
- * Modified to new api Jan 2001 by James Simmons (jsimmons@transvirtual.com)
- *
- * Created 28 Dec 1997 by Geert Uytterhoeven
- *
- *
- * I have started rewriting this driver as a example of the upcoming new API
- * The primary goal is to remove the console code from fbdev and place it
- * into fbcon.c. This reduces the code and makes writing a new fbdev driver
- * easy since the author doesn't need to worry about console internals. It
- * also allows the ability to run fbdev without a console/tty system on top
- * of it.
- *
- * First the roles of struct fb_info and struct display have changed. Struct
- * display will go away. The way the new framebuffer console code will
- * work is that it will act to translate data about the tty/console in
- * struct vc_data to data in a device independent way in struct fb_info. Then
- * various functions in struct fb_ops will be called to store the device
- * dependent state in the par field in struct fb_info and to change the
- * hardware to that state. This allows a very clean separation of the fbdev
- * layer from the console layer. It also allows one to use fbdev on its own
- * which is a bounus for embedded devices. The reason this approach works is
- * for each framebuffer device when used as a tty/console device is allocated
- * a set of virtual terminals to it. Only one virtual terminal can be active
- * per framebuffer device. We already have all the data we need in struct
- * vc_data so why store a bunch of colormaps and other fbdev specific data
- * per virtual terminal.
- *
- * As you can see doing this makes the con parameter pretty much useless
- * for struct fb_ops functions, as it should be. Also having struct
- * fb_var_screeninfo and other data in fb_info pretty much eliminates the
- * need for get_fix and get_var. Once all drivers use the fix, var, and cmap
- * fbcon can be written around these fields. This will also eliminate the
- * need to regenerate struct fb_var_screeninfo, struct fb_fix_screeninfo
- * struct fb_cmap every time get_var, get_fix, get_cmap functions are called
- * as many drivers do now.
- *
- * 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.
- */
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/errno.h>
- #include <linux/string.h>
- #include <linux/mm.h>
- #include <linux/slab.h>
- #include <linux/delay.h>
- #include <linux/fb.h>
- #include <linux/init.h>
- #include <linux/pci.h>
- /*
- * This is just simple sample code.
- *
- * No warranty that it actually compiles.
- * Even less warranty that it actually works :-)
- */
- /*
- * Driver data
- */
- static char *mode_option __devinitdata;
- /*
- * If your driver supports multiple boards, you should make the
- * below data types arrays, or allocate them dynamically (using kmalloc()).
- */
- /*
- * This structure defines the hardware state of the graphics card. Normally
- * you place this in a header file in linux/include/video. This file usually
- * also includes register information. That allows other driver subsystems
- * and userland applications the ability to use the same header file to
- * avoid duplicate work and easy porting of software.
- */
- struct xxx_par;
- /*
- * Here we define the default structs fb_fix_screeninfo and fb_var_screeninfo
- * if we don't use modedb. If we do use modedb see xxxfb_init how to use it
- * to get a fb_var_screeninfo. Otherwise define a default var as well.
- */
- static struct fb_fix_screeninfo xxxfb_fix __devinitdata = {
- .id = "FB's name",
- .type = FB_TYPE_PACKED_PIXELS,
- .visual = FB_VISUAL_PSEUDOCOLOR,
- .xpanstep = 1,
- .ypanstep = 1,
- .ywrapstep = 1,
- .accel = FB_ACCEL_NONE,
- };
- /*
- * Modern graphical hardware not only supports pipelines but some
- * also support multiple monitors where each display can have its
- * its own unique data. In this case each display could be
- * represented by a separate framebuffer device thus a separate
- * struct fb_info. Now the struct xxx_par represents the graphics
- * hardware state thus only one exist per card. In this case the
- * struct xxx_par for each graphics card would be shared between
- * every struct fb_info that represents a framebuffer on that card.
- * This allows when one display changes it video resolution (info->var)
- * the other displays know instantly. Each display can always be
- * aware of the entire hardware state that affects it because they share
- * the same xxx_par struct. The other side of the coin is multiple
- * graphics cards that pass data around until it is finally displayed
- * on one monitor. Such examples are the voodoo 1 cards and high end
- * NUMA graphics servers. For this case we have a bunch of pars, each
- * one that represents a graphics state, that belong to one struct
- * fb_info. Their you would want to have *par point to a array of device
- * states and have each struct fb_ops function deal with all those
- * states. I hope this covers every possible hardware design. If not
- * feel free to send your ideas at jsimmons@users.sf.net
- */
- /*
- * If your driver supports multiple boards or it supports multiple
- * framebuffers, you should make these arrays, or allocate them
- * dynamically using framebuffer_alloc() and free them with
- * framebuffer_release().
- */
- static struct fb_info info;
- /*
- * Each one represents the state of the hardware. Most hardware have
- * just one hardware state. These here represent the default state(s).
- */
- static struct xxx_par __initdata current_par;
- int xxxfb_init(void);
- /**
- * xxxfb_open - Optional function. Called when the framebuffer is
- * first accessed.
- * @info: frame buffer structure that represents a single frame buffer
- * @user: tell us if the userland (value=1) or the console is accessing
- * the framebuffer.
- *
- * This function is the first function called in the framebuffer api.
- * Usually you don't need to provide this function. The case where it
- * is used is to change from a text mode hardware state to a graphics
- * mode state.
- *
- * Returns negative errno on error, or zero on success.
- */
- static int xxxfb_open(struct fb_info *info, int user)
- {
- return 0;
- }
- /**
- * xxxfb_release - Optional function. Called when the framebuffer
- * device is closed.
- * @info: frame buffer structure that represents a single frame buffer
- * @user: tell us if the userland (value=1) or the console is accessing
- * the framebuffer.
- *
- * Thus function is called when we close /dev/fb or the framebuffer
- * console system is released. Usually you don't need this function.
- * The case where it is usually used is to go from a graphics state
- * to a text mode state.
- *
- * Returns negative errno on error, or zero on success.
- */
- static int xxxfb_release(struct fb_info *info, int user)
- {
- return 0;
- }
- /**
- * xxxfb_check_var - Optional function. Validates a var passed in.
- * @var: frame buffer variable screen structure
- * @info: frame buffer structure that represents a single frame buffer
- *
- * Checks to see if the hardware supports the state requested by
- * var passed in. This function does not alter the hardware state!!!
- * This means the data stored in struct fb_info and struct xxx_par do
- * not change. This includes the var inside of struct fb_info.
- * Do NOT change these. This function can be called on its own if we
- * intent to only test a mode and not actually set it. The stuff in
- * modedb.c is a example of this. If the var passed in is slightly
- * off by what the hardware can support then we alter the var PASSED in
- * to what we can do.
- *
- * For values that are off, this function must round them _up_ to the
- * next value that is supported by the hardware. If the value is
- * greater than the highest value supported by the hardware, then this
- * function must return -EINVAL.
- *
- * Exception to the above rule: Some drivers have a fixed mode, ie,
- * the hardware is already set at boot up, and cannot be changed. In
- * this case, it is more acceptable that this function just return
- * a copy of the currently working var (info->var). Better is to not
- * implement this function, as the upper layer will do the copying
- * of the current var for you.
- *
- * Note: This is the only function where the contents of var can be
- * freely adjusted after the driver has been registered. If you find
- * that you have code outside of this function that alters the content
- * of var, then you are doing something wrong. Note also that the
- * contents of info->var must be left untouched at all times after
- * driver registration.
- *
- * Returns negative errno on error, or zero on success.
- */
- static int xxxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
- {
- /* ... */
- return 0;
- }
- /**
- * xxxfb_set_par - Optional function. Alters the hardware state.
- * @info: frame buffer structure that represents a single frame buffer
- *
- * Using the fb_var_screeninfo in fb_info we set the resolution of the
- * this particular framebuffer. This function alters the par AND the
- * fb_fix_screeninfo stored in fb_info. It doesn't not alter var in
- * fb_info since we are using that data. This means we depend on the
- * data in var inside fb_info to be supported by the hardware.
- *
- * This function is also used to recover/restore the hardware to a
- * known working state.
- *
- * xxxfb_check_var is always called before xxxfb_set_par to ensure that
- * the contents of var is always valid.
- *
- * Again if you can't change the resolution you don't need this function.
- *
- * However, even if your hardware does not support mode changing,
- * a set_par might be needed to at least initialize the hardware to
- * a known working state, especially if it came back from another
- * process that also modifies the same hardware, such as X.
- *
- * If this is the case, a combination such as the following should work:
- *
- * static int xxxfb_check_var(struct fb_var_screeninfo *var,
- * struct fb_info *info)
- * {
- * *var = info->var;
- * return 0;
- * }
- *