diff options
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/Config.in | 3 | ||||
-rw-r--r-- | drivers/video/Makefile | 63 | ||||
-rw-r--r-- | drivers/video/amifb.c | 2 | ||||
-rw-r--r-- | drivers/video/matrox/Makefile | 38 | ||||
-rw-r--r-- | drivers/video/matrox/matroxfb_DAC1064.c | 64 | ||||
-rw-r--r-- | drivers/video/matrox/matroxfb_DAC1064.h | 15 | ||||
-rw-r--r-- | drivers/video/matrox/matroxfb_base.c | 15 | ||||
-rw-r--r-- | drivers/video/matrox/matroxfb_base.h | 3 | ||||
-rw-r--r-- | drivers/video/matrox/matroxfb_crtc2.c | 11 | ||||
-rw-r--r-- | drivers/video/matrox/matroxfb_g450.c | 201 | ||||
-rw-r--r-- | drivers/video/matrox/matroxfb_g450.h | 11 | ||||
-rw-r--r-- | drivers/video/riva/Makefile | 5 | ||||
-rw-r--r-- | drivers/video/sis/Makefile | 6 |
13 files changed, 313 insertions, 124 deletions
diff --git a/drivers/video/Config.in b/drivers/video/Config.in index 866df0ea5..b8a8fe374 100644 --- a/drivers/video/Config.in +++ b/drivers/video/Config.in @@ -104,13 +104,14 @@ if [ "$CONFIG_FB" = "y" ]; then if [ "$CONFIG_FB_MATROX" != "n" ]; then bool ' Millennium I/II support' CONFIG_FB_MATROX_MILLENIUM bool ' Mystique support' CONFIG_FB_MATROX_MYSTIQUE - bool ' G100/G200/G400 support' CONFIG_FB_MATROX_G100 + bool ' G100/G200/G400/G450 support' CONFIG_FB_MATROX_G100 if [ "$CONFIG_I2C" != "n" ]; then dep_tristate ' Matrox I2C support' CONFIG_FB_MATROX_I2C $CONFIG_FB_MATROX $CONFIG_I2C_ALGOBIT if [ "$CONFIG_FB_MATROX_G100" = "y" ]; then dep_tristate ' G400 second head support' CONFIG_FB_MATROX_MAVEN $CONFIG_FB_MATROX_I2C fi fi + dep_tristate ' G450 second head support' CONFIG_FB_MATROX_G450 $CONFIG_FB_MATROX_G100 bool ' Multihead support' CONFIG_FB_MATROX_MULTIHEAD fi tristate ' ATI Mach64 display support (EXPERIMENTAL)' CONFIG_FB_ATY diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 54dd6eca1..778af1db6 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -2,14 +2,9 @@ # 5 Aug 1999, James Simmons, <mailto:jsimmons@edgeglobal.com> # Rewritten to use lists instead of if-statements. -SUB_DIRS := -MOD_SUB_DIRS := $(SUB_DIRS) -MOD_IN_SUB_DIRS := -ALL_SUB_DIRS := $(SUB_DIRS) matrox riva - O_TARGET := video.o -O_OBJS := -M_OBJS := + +mod-subdirs := matrox # All of the (potential) objects that export symbols. # This list comes from 'grep -l EXPORT_SYMBOL *.[hc]'. @@ -19,14 +14,8 @@ export-objs := fbmem.o fbcmap.o fbcon.o fbmon.o modedb.o \ fbcon-vga.o fbcon-iplan2p2.o fbcon-iplan2p4.o \ fbcon-iplan2p8.o fbcon-vga-planes.o fbcon-cfb16.o \ fbcon-cfb2.o fbcon-cfb24.o fbcon-cfb32.o fbcon-cfb4.o \ - fbcon-cfb8.o fbcon-mac.o fbcon-mfb.o fbcon-vga8-planes.o \ - matrox/matroxfb.o cyber2000fb.o fbcon-hga.o - -# Object file lists. -obj-y := -obj-m := -obj-n := -obj- := + fbcon-cfb8.o fbcon-mac.o fbcon-mfb.o \ + cyber2000fb.o fbcon-hga.o # Each configuration option enables a list of files. @@ -91,35 +80,21 @@ obj-$(CONFIG_FB_P9100) += p9100fb.o sbusfb.o obj-$(CONFIG_FB_LEO) += leofb.o sbusfb.o obj-$(CONFIG_FB_PMAGBA) += pmag-ba-fb.o +subdir-$(CONFIG_FB_MATROX) += matrox ifeq ($(CONFIG_FB_MATROX),y) -SUB_DIRS += matrox obj-y += matrox/matrox.o -MOD_SUB_DIRS += matrox -else - ifeq ($(CONFIG_FB_MATROX),m) - MOD_SUB_DIRS += matrox - endif endif +subdir-$(CONFIG_FB_RIVA) += riva ifeq ($(CONFIG_FB_RIVA),y) -SUB_DIRS += riva obj-y += riva/rivafb.o -else - ifeq ($(CONFIG_FB_RIVA),m) - MOD_SUB_DIRS += riva - endif endif +subdir-$(CONFIG_FB_SIS) += sis ifeq ($(CONFIG_FB_SIS),y) -SUB_DIRS += sis obj-y += sis/sisfb.o -else - ifeq ($(CONFIG_FB_SIS),m) - MOD_SUB_DIRS += sis - endif endif - obj-$(CONFIG_FB_SUN3) += sun3fb.o obj-$(CONFIG_FB_BWTWO) += bwtwofb.o obj-$(CONFIG_FB_HGA) += hgafb.o @@ -146,30 +121,6 @@ obj-$(CONFIG_FBCON_MFB) += fbcon-mfb.o obj-$(CONFIG_FBCON_VGA) += fbcon-vga.o obj-$(CONFIG_FBCON_HGA) += fbcon-hga.o -# Extract lists of the multi-part drivers. -# The 'int-*' lists are the intermediate files used to build the multi's. - -multi-y := $(filter $(list-multi), $(obj-y)) -multi-m := $(filter $(list-multi), $(obj-m)) -int-y := $(sort $(foreach m, $(multi-y), $($(basename $(m))-objs))) -int-m := $(sort $(foreach m, $(multi-m), $($(basename $(m))-objs))) - -# Files that are both resident and modular: remove from modular. - -obj-m := $(filter-out $(obj-y), $(obj-m)) -int-m := $(filter-out $(int-y), $(int-m)) - -# Take multi-part drivers out of obj-y and put components in. - -obj-y := $(filter-out $(list-multi), $(obj-y)) $(int-y) - -# Translate to Rules.make lists. - -O_OBJS := $(filter-out $(export-objs), $(obj-y)) -OX_OBJS := $(filter $(export-objs), $(obj-y)) -M_OBJS := $(sort $(filter-out $(export-objs), $(obj-m))) -MX_OBJS := $(sort $(filter $(export-objs), $(obj-m))) - include $(TOPDIR)/Rules.make clean: diff --git a/drivers/video/amifb.c b/drivers/video/amifb.c index 44f6fc8c5..8a1e7f01e 100644 --- a/drivers/video/amifb.c +++ b/drivers/video/amifb.c @@ -1766,7 +1766,7 @@ default_chipset: * access the videomem with writethrough cache */ videomemory_phys = (u_long)ZTWO_PADDR(videomemory); - //videomemory = (u_long)ioremap_writethrough(videomemory_phys, videomemorysize); + videomemory = (u_long)ioremap_writethrough(videomemory_phys, videomemorysize); if (!videomemory) { printk("amifb: WARNING! unable to map videomem cached writethrough\n"); videomemory = ZTWO_VADDR(videomemory_phys); diff --git a/drivers/video/matrox/Makefile b/drivers/video/matrox/Makefile index fcf02722b..2b7945150 100644 --- a/drivers/video/matrox/Makefile +++ b/drivers/video/matrox/Makefile @@ -2,55 +2,19 @@ # 5 Aug 1999, James Simmons, <mailto:jsimmons@edgeglobal.com> # Rewritten to use lists instead of if-statements. -SUB_DIRS := -MOD_SUB_DIRS := $(SUB_DIRS) -MOD_IN_SUB_DIRS := -ALL_SUB_DIRS := $(SUB_DIRS) - O_TARGET := matrox.o -O_OBJS := -M_OBJS := # All of the (potential) objects that export symbols. # This list comes from 'grep -l EXPORT_SYMBOL *.[hc]'. export-objs := matroxfb_base.o matroxfb_accel.o matroxfb_DAC1064.o matroxfb_Ti3026.o matroxfb_misc.o -# Object file lists. -obj-y := -obj-m := -obj-n := -obj- := - # Each configuration option enables a list of files. obj-$(CONFIG_FB_MATROX) += matroxfb_base.o matroxfb_accel.o matroxfb_DAC1064.o matroxfb_Ti3026.o matroxfb_misc.o obj-$(CONFIG_FB_MATROX_I2C) += i2c-matroxfb.o obj-$(CONFIG_FB_MATROX_MAVEN) += matroxfb_maven.o matroxfb_crtc2.o - -# Extract lists of the multi-part drivers. -# The 'int-*' lists are the intermediate files used to build the multi's. - -multi-y := $(filter $(list-multi), $(obj-y)) -multi-m := $(filter $(list-multi), $(obj-m)) -int-y := $(sort $(foreach m, $(multi-y), $($(basename $(m))-objs))) -int-m := $(sort $(foreach m, $(multi-m), $($(basename $(m))-objs))) - -# Files that are both resident and modular: remove from modular. - -obj-m := $(filter-out $(obj-y), $(obj-m)) -int-m := $(filter-out $(int-y), $(int-m)) - -# Take multi-part drivers out of obj-y and put components in. - -obj-y := $(filter-out $(list-multi), $(obj-y)) $(int-y) - -# Translate to Rules.make lists. - -O_OBJS := $(filter-out $(export-objs), $(obj-y)) -OX_OBJS := $(filter $(export-objs), $(obj-y)) -M_OBJS := $(sort $(filter-out $(export-objs), $(obj-m))) -MX_OBJS := $(sort $(filter $(export-objs), $(obj-m))) +obj-$(CONFIG_FB_MATROX_G450) += matroxfb_g450.o matroxfb_crtc2.o include $(TOPDIR)/Rules.make diff --git a/drivers/video/matrox/matroxfb_DAC1064.c b/drivers/video/matrox/matroxfb_DAC1064.c index 1c611ebee..c080de89a 100644 --- a/drivers/video/matrox/matroxfb_DAC1064.c +++ b/drivers/video/matrox/matroxfb_DAC1064.c @@ -227,15 +227,35 @@ static void DAC1064_calcclock(CPMINFO unsigned int freq, unsigned int fmax, unsi DBG("DAC1064_calcclock") fvco = PLL_calcclock(PMINFO freq, fmax, in, feed, &p); - p = (1 << p) - 1; - if (fvco <= 100000) - ; - else if (fvco <= 140000) - p |= 0x08; - else if (fvco <= 180000) - p |= 0x10; - else - p |= 0x18; + + if (ACCESS_FBINFO(devflags.g450dac)) { + if (fvco <= 300000) /* 276-324 */ + ; + else if (fvco <= 400000) /* 378-438 */ + p |= 0x08; + else if (fvco <= 550000) /* 540-567 */ + p |= 0x10; + else if (fvco <= 690000) /* 675-695 */ + p |= 0x18; + else if (fvco <= 800000) /* 776-803 */ + p |= 0x20; + else if (fvco <= 891000) /* 891-891 */ + p |= 0x28; + else if (fvco <= 940000) /* 931-945 */ + p |= 0x30; + else /* <959 */ + p |= 0x38; + } else { + p = (1 << p) - 1; + if (fvco <= 100000) + ; + else if (fvco <= 140000) + p |= 0x08; + else if (fvco <= 180000) + p |= 0x10; + else + p |= 0x18; + } *post = p; } @@ -340,15 +360,19 @@ void DAC1064_global_init(CPMINFO struct matrox_hw_state* hw) { hw->DACreg[POS1064_XMISCCTRL] &= M1064_XMISCCTRL_DAC_WIDTHMASK; hw->DACreg[POS1064_XMISCCTRL] |= M1064_XMISCCTRL_LUT_EN; hw->DACreg[POS1064_XPIXCLKCTRL] = M1064_XPIXCLKCTRL_PLL_UP | M1064_XPIXCLKCTRL_EN | M1064_XPIXCLKCTRL_SRC_PLL; -#if defined(CONFIG_FB_MATROX_MAVEN) || defined(CONFIG_FB_MATROX_MAVEN_MODULE) + hw->DACreg[POS1064_XOUTPUTCONN] = 0x01; /* output #1 enabled */ if (ACCESS_FBINFO(output.ph) & MATROXFB_OUTPUT_CONN_SECONDARY) { - hw->DACreg[POS1064_XPIXCLKCTRL] = M1064_XPIXCLKCTRL_PLL_UP | M1064_XPIXCLKCTRL_EN | M1064_XPIXCLKCTRL_SRC_EXT; - hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_MAFC | G400_XMISCCTRL_VDO_MAFC12; + if (ACCESS_FBINFO(devflags.g450dac)) { + hw->DACreg[POS1064_XPIXCLKCTRL] = M1064_XPIXCLKCTRL_PLL_UP | M1064_XPIXCLKCTRL_EN | M1064_XPIXCLKCTRL_SRC_PLL2; + hw->DACreg[POS1064_XOUTPUTCONN] = 0x05; /* output #1 enabled; CRTC1 connected to output #2 */ + } else { + hw->DACreg[POS1064_XPIXCLKCTRL] = M1064_XPIXCLKCTRL_PLL_UP | M1064_XPIXCLKCTRL_EN | M1064_XPIXCLKCTRL_SRC_EXT; + hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_MAFC | G400_XMISCCTRL_VDO_MAFC12; + } } else if (ACCESS_FBINFO(output.sh) & MATROXFB_OUTPUT_CONN_SECONDARY) { hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_MAFC | G400_XMISCCTRL_VDO_C2_MAFC12; - } else -#endif - if (ACCESS_FBINFO(output.ph) & MATROXFB_OUTPUT_CONN_DFP) + hw->DACreg[POS1064_XOUTPUTCONN] = 0x09; /* output #1 enabled; CRTC2 connected to output #2 */ + } else if (ACCESS_FBINFO(output.ph) & MATROXFB_OUTPUT_CONN_DFP) hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_PANELLINK | G400_XMISCCTRL_VDO_MAFC12; else hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_DIS; @@ -363,6 +387,10 @@ void DAC1064_global_restore(CPMINFO const struct matrox_hw_state* hw) { if (ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG400) { outDAC1064(PMINFO 0x20, 0x04); outDAC1064(PMINFO 0x1F, 0x00); + if (ACCESS_FBINFO(devflags.g450dac)) { + outDAC1064(PMINFO M1064_X8B, 0xCC); /* only matrox know... */ + outDAC1064(PMINFO M1064_XOUTPUTCONN, hw->DACreg[POS1064_XOUTPUTCONN]); + } } } @@ -738,7 +766,11 @@ static int MGAG100_preinit(WPMINFO struct matrox_hw_state* hw){ DBG("MGAG100_preinit") /* there are some instabilities if in_div > 19 && vco < 61000 */ - ACCESS_FBINFO(features.pll.vco_freq_min) = 62000; + if (ACCESS_FBINFO(devflags.g450dac)) { + ACCESS_FBINFO(features.pll.vco_freq_min) = 130000; /* my sample: >118 */ + } else { + ACCESS_FBINFO(features.pll.vco_freq_min) = 62000; + } ACCESS_FBINFO(features.pll.ref_freq) = 27000; ACCESS_FBINFO(features.pll.feed_div_min) = 7; ACCESS_FBINFO(features.pll.feed_div_max) = 127; diff --git a/drivers/video/matrox/matroxfb_DAC1064.h b/drivers/video/matrox/matroxfb_DAC1064.h index 256a11d2c..e072657b3 100644 --- a/drivers/video/matrox/matroxfb_DAC1064.h +++ b/drivers/video/matrox/matroxfb_DAC1064.h @@ -63,6 +63,8 @@ void DAC1064_global_restore(CPMINFO const struct matrox_hw_state*); #define M1064_XPIXCLKCTRL_SRC_PCI 0x00 #define M1064_XPIXCLKCTRL_SRC_PLL 0x01 #define M1064_XPIXCLKCTRL_SRC_EXT 0x02 +#define M1064_XPIXCLKCTRL_SRC_SYS 0x03 /* G200/G400 */ +#define M1064_XPIXCLKCTRL_SRC_PLL2 0x03 /* G450 */ #define M1064_XPIXCLKCTRL_SRC_MASK 0x03 #define M1064_XPIXCLKCTRL_EN 0x00 #define M1064_XPIXCLKCTRL_DIS 0x04 @@ -132,6 +134,16 @@ void DAC1064_global_restore(CPMINFO const struct matrox_hw_state*); #define M1064_XPIXPLLCP 0x4E #define M1064_XPIXPLLSTAT 0x4F +#define M1064_XTVO_IDX 0x87 +#define M1064_XTVO_DATA 0x88 + +#define M1064_XOUTPUTCONN 0x8A +#define M1064_X8B 0x8B +#define M1064_XPIXPLL2STAT 0x8C +#define M1064_XPIXPLL2P 0x8D +#define M1064_XPIXPLL2N 0x8E +#define M1064_XPIXPLL2M 0x8F + enum POS1064 { POS1064_XCURADDL=0, POS1064_XCURADDH, POS1064_XCURCTRL, POS1064_XCURCOL0RED, POS1064_XCURCOL0GREEN, POS1064_XCURCOL0BLUE, @@ -141,7 +153,8 @@ enum POS1064 { POS1064_XMISCCTRL, POS1064_XGENIOCTRL, POS1064_XGENIODATA, POS1064_XZOOMCTRL, POS1064_XSENSETEST, POS1064_XCRCBITSEL, - POS1064_XCOLKEYMASKL, POS1064_XCOLKEYMASKH, POS1064_XCOLKEYL, POS1064_XCOLKEYH }; + POS1064_XCOLKEYMASKL, POS1064_XCOLKEYMASKH, POS1064_XCOLKEYL, POS1064_XCOLKEYH, + POS1064_XOUTPUTCONN }; #endif /* __MATROXFB_DAC1064_H__ */ diff --git a/drivers/video/matrox/matroxfb_base.c b/drivers/video/matrox/matroxfb_base.c index 5a0893496..090895204 100644 --- a/drivers/video/matrox/matroxfb_base.c +++ b/drivers/video/matrox/matroxfb_base.c @@ -1421,12 +1421,15 @@ static struct video_board vbG400 = {0x2000000, 0x1000000, FB_ACCEL_MATROX_MGAG4 #define DEVF_CRTC2 0x0800 #define DEVF_MAVEN_CAPABLE 0x1000 #define DEVF_PANELLINK_CAPABLE 0x2000 +#define DEVF_G450DAC 0x4000 #define DEVF_GCORE (DEVF_VIDEO64BIT | DEVF_SWAPS | DEVF_CROSS4MB | DEVF_DDC_8_2) #define DEVF_G2CORE (DEVF_GCORE | DEVF_ANY_VXRES | DEVF_MAVEN_CAPABLE | DEVF_PANELLINK_CAPABLE) #define DEVF_G100 (DEVF_GCORE) /* no doc, no vxres... */ #define DEVF_G200 (DEVF_G2CORE) #define DEVF_G400 (DEVF_G2CORE | DEVF_SUPPORT32MB | DEVF_TEXT16B | DEVF_CRTC2) +/* if you'll find how to drive DFP... */ +#define DEVF_G450 (DEVF_GCORE | DEVF_ANY_VXRES | DEVF_SUPPORT32MB | DEVF_TEXT16B | DEVF_CRTC2 | DEVF_G450DAC) static struct board { unsigned short vendor, device, rev, svid, sid; @@ -1554,18 +1557,24 @@ static struct board { 230000, &vbG200, "unknown G200 (AGP)"}, - {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G400_AGP, 0xFF, + {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G400_AGP, 0x80, PCI_SS_VENDOR_ID_MATROX, PCI_SS_ID_MATROX_MILLENNIUM_G400_MAX_AGP, DEVF_G400, 360000, &vbG400, "Millennium G400 MAX (AGP)"}, - {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G400_AGP, 0xFF, + {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G400_AGP, 0x80, 0, 0, DEVF_G400, 300000, &vbG400, "unknown G400 (AGP)"}, + {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G400_AGP, 0xFF, + 0, 0, + DEVF_G450, + 500000, /* ??? vco goes up to 900MHz... */ + &vbG400, + "unknown G450 (AGP)"}, #endif {0, 0, 0xFF, 0, 0, @@ -1627,7 +1636,7 @@ static int initMatrox2(WPMINFO struct display* d, struct board* b){ if (dfp) ACCESS_FBINFO(output.ph) |= MATROXFB_OUTPUT_CONN_DFP; } - + ACCESS_FBINFO(devflags.g450dac) = b->flags & DEVF_G450DAC; ACCESS_FBINFO(devflags.textstep) = ACCESS_FBINFO(devflags.vgastep) * ACCESS_FBINFO(devflags.textmode); ACCESS_FBINFO(devflags.textvram) = 65536 / ACCESS_FBINFO(devflags.textmode); diff --git a/drivers/video/matrox/matroxfb_base.h b/drivers/video/matrox/matroxfb_base.h index 125f8be4f..68a8ab883 100644 --- a/drivers/video/matrox/matroxfb_base.h +++ b/drivers/video/matrox/matroxfb_base.h @@ -374,7 +374,7 @@ struct mavenregs { struct matrox_hw_state { u_int32_t MXoptionReg; unsigned char DACclk[6]; - unsigned char DACreg[64]; + unsigned char DACreg[80]; unsigned char MiscOutReg; unsigned char DACpal[768]; unsigned char CRTC[25]; @@ -531,6 +531,7 @@ struct matrox_fb_info { unsigned int ydstorg; /* offset in bytes from video start to usable memory */ /* 0 except for 6MB Millenium */ int memtype; + int g450dac; } devflags; struct display_switch dispsw; struct { diff --git a/drivers/video/matrox/matroxfb_crtc2.c b/drivers/video/matrox/matroxfb_crtc2.c index 515eb1e78..6119dbbb8 100644 --- a/drivers/video/matrox/matroxfb_crtc2.c +++ b/drivers/video/matrox/matroxfb_crtc2.c @@ -104,9 +104,14 @@ static void matroxfb_dh_restore(struct matroxfb_dh_fb_info* m2info, tmp |= 0x00000001; /* enable CRTC2 */ if (ACCESS_FBINFO(output.sh) & MATROXFB_OUTPUT_CONN_SECONDARY) { - tmp |= 0x00000002; /* source from VDOCLK */ - tmp |= 0xC0000000; /* enable vvidrst & hvidrst */ - /* MGA TVO is our clock source */ + if (ACCESS_FBINFO(devflags.g450dac)) { + tmp |= 0x00000006; /* source from secondary pixel PLL */ + /* no vidrst */ + } else { + tmp |= 0x00000002; /* source from VDOCLK */ + tmp |= 0xC0000000; /* enable vvidrst & hvidrst */ + /* MGA TVO is our clock source */ + } } else if (ACCESS_FBINFO(output.sh) & MATROXFB_OUTPUT_CONN_PRIMARY) { tmp |= 0x00000004; /* source from pixclock */ /* PIXPLL is our clock source */ diff --git a/drivers/video/matrox/matroxfb_g450.c b/drivers/video/matrox/matroxfb_g450.c new file mode 100644 index 000000000..8640289b1 --- /dev/null +++ b/drivers/video/matrox/matroxfb_g450.c @@ -0,0 +1,201 @@ +#include "matroxfb_g450.h" +#include "matroxfb_misc.h" +#include "matroxfb_DAC1064.h" +#include <linux/matroxfb.h> +#include <asm/uaccess.h> + +static int matroxfb_g450_get_reg(WPMINFO int reg) { + int val; + + matroxfb_DAC_lock(); + val = matroxfb_DAC_in(PMINFO reg); + matroxfb_DAC_unlock(); + return val; +} + +static int matroxfb_g450_set_reg(WPMINFO int reg, int val) { + matroxfb_DAC_lock(); + matroxfb_DAC_out(PMINFO reg, val); + matroxfb_DAC_unlock(); + return 0; +} + +static const struct matrox_pll_features maven_pll = { + 110000, + 27000, + 4, 127, + 2, 31, + 3 +}; + +static void DAC1064_calcclock(unsigned int freq, unsigned int fmax, + unsigned int* in, unsigned int* feed, unsigned int* post) { + unsigned int fvco; + unsigned int p; + + fvco = matroxfb_PLL_calcclock(&maven_pll, freq, fmax, in, feed, &p); + /* 0 => 100 ... 275 MHz + 1 => 243 ... 367 MHz + 2 => 320 ... 475 MHz + 3 => 453 ... 556 MHz + 4 => 540 ... 594 MHz + 5 => 588 ... 621 MHz + 6 => 626 ... 637 MHz + 7 => 631 ... 642 MHz + + As you can see, never choose frequency > 621 MHz, there is unavailable gap... + Just to be sure, currently driver uses 110 ... 500 MHz range. + */ + if (fvco <= 260000) + ; + else if (fvco <= 350000) + p |= 0x08; + else if (fvco <= 460000) + p |= 0x10; + else if (fvco <= 550000) + p |= 0x18; + else if (fvco <= 590000) + p |= 0x20; + else + p |= 0x28; + *post = p; + return; +} + +static inline int matroxfb_g450_compute_timming(struct matroxfb_g450_info* m2info, + struct my_timming* mt, + struct mavenregs* m) { + unsigned int a, b, c; + + DAC1064_calcclock(mt->pixclock, 500000, &a, &b, &c); + m->regs[0x80] = a; + m->regs[0x81] = b; + m->regs[0x82] = c; + printk(KERN_DEBUG "PLL: %02X %02X %02X\n", a, b, c); + return 0; +} + +static inline int matroxfb_g450_program_timming(struct matroxfb_g450_info* m2info, const struct mavenregs* m) { + MINFO_FROM(m2info->primary_dev); + + matroxfb_g450_set_reg(PMINFO M1064_XPIXPLL2M, m->regs[0x81]); + matroxfb_g450_set_reg(PMINFO M1064_XPIXPLL2N, m->regs[0x80]); + matroxfb_g450_set_reg(PMINFO M1064_XPIXPLL2P, m->regs[0x82]); + return 0; +} + +/******************************************************/ + +static int matroxfb_g450_compute(void* md, struct my_timming* mt, struct matrox_hw_state* mr) { + return matroxfb_g450_compute_timming(md, mt, &mr->maven); +} + +static int matroxfb_g450_program(void* md, const struct matrox_hw_state* mr) { + return matroxfb_g450_program_timming(md, &mr->maven); +} + +static int matroxfb_g450_start(void* md) { + return 0; +} + +static void matroxfb_g450_incuse(void* md) { + MOD_INC_USE_COUNT; +} + +static void matroxfb_g450_decuse(void* md) { + MOD_DEC_USE_COUNT; +} + +static int matroxfb_g450_set_mode(void* md, u_int32_t arg) { + if (arg == MATROXFB_OUTPUT_MODE_MONITOR) { + return 1; + } + return -EINVAL; +} + +static int matroxfb_g450_get_mode(void* md, u_int32_t* arg) { + *arg = MATROXFB_OUTPUT_MODE_MONITOR; + return 0; +} + +static struct matrox_altout matroxfb_g450_altout = { + matroxfb_g450_compute, + matroxfb_g450_program, + matroxfb_g450_start, + matroxfb_g450_incuse, + matroxfb_g450_decuse, + matroxfb_g450_set_mode, + matroxfb_g450_get_mode +}; + +static int matroxfb_g450_connect(struct matroxfb_g450_info* m2info) { + MINFO_FROM(m2info->primary_dev); + + down_write(&ACCESS_FBINFO(altout.lock)); + ACCESS_FBINFO(altout.device) = m2info; + ACCESS_FBINFO(altout.output) = &matroxfb_g450_altout; + up_write(&ACCESS_FBINFO(altout.lock)); + ACCESS_FBINFO(output.all) |= MATROXFB_OUTPUT_CONN_SECONDARY; + return 0; +} + +static void matroxfb_g450_shutdown(struct matroxfb_g450_info* m2info) { + MINFO_FROM(m2info->primary_dev); + + if (MINFO) { + ACCESS_FBINFO(output.all) &= ~MATROXFB_OUTPUT_CONN_SECONDARY; + ACCESS_FBINFO(output.ph) &= ~MATROXFB_OUTPUT_CONN_SECONDARY; + ACCESS_FBINFO(output.sh) &= ~MATROXFB_OUTPUT_CONN_SECONDARY; + down_write(&ACCESS_FBINFO(altout.lock)); + ACCESS_FBINFO(altout.device) = NULL; + ACCESS_FBINFO(altout.output) = NULL; + up_write(&ACCESS_FBINFO(altout.lock)); + m2info->primary_dev = NULL; + } +} + +/* we do not have __setup() yet */ +static void* matroxfb_g450_probe(struct matrox_fb_info* minfo) { + struct matroxfb_g450_info* m2info; + + /* hardware is not G450 incapable... */ + if (!ACCESS_FBINFO(devflags.g450dac)) + return NULL; + m2info = (struct matroxfb_g450_info*)kmalloc(sizeof(*m2info), GFP_KERNEL); + if (!m2info) { + printk(KERN_ERR "matroxfb_g450: Not enough memory for G450 DAC control structs\n"); + return NULL; + } + memset(m2info, 0, sizeof(*m2info)); + m2info->primary_dev = MINFO; + if (matroxfb_g450_connect(m2info)) { + kfree(m2info); + printk(KERN_ERR "matroxfb_g450: G450 DAC failed to initialize\n"); + return NULL; + } + return m2info; +} + +static void matroxfb_g450_remove(struct matrox_fb_info* minfo, void* g450) { + matroxfb_g450_shutdown(g450); + kfree(g450); +} + +static struct matroxfb_driver g450 = { + name: "Matrox G450 output #2", + probe: matroxfb_g450_probe, + remove: matroxfb_g450_remove }; + +static int matroxfb_g450_init(void) { + matroxfb_register_driver(&g450); + return 0; +} + +static void matroxfb_g450_exit(void) { + matroxfb_unregister_driver(&g450); +} + +MODULE_AUTHOR("(c) 2000 Petr Vandrovec <vandrove@vc.cvut.cz>"); +MODULE_DESCRIPTION("Matrox G450 secondary output driver"); +module_init(matroxfb_g450_init); +module_exit(matroxfb_g450_exit); diff --git a/drivers/video/matrox/matroxfb_g450.h b/drivers/video/matrox/matroxfb_g450.h new file mode 100644 index 000000000..51aefca7e --- /dev/null +++ b/drivers/video/matrox/matroxfb_g450.h @@ -0,0 +1,11 @@ +#ifndef __MATROXFB_G450_H__ +#define __MATROXFB_G450_H__ + +#include <linux/ioctl.h> +#include "matroxfb_base.h" + +struct matroxfb_g450_info { + struct matrox_fb_info* primary_dev; +}; + +#endif /* __MATROXFB_MAVEN_H__ */ diff --git a/drivers/video/riva/Makefile b/drivers/video/riva/Makefile index 87502e25c..07d87e752 100644 --- a/drivers/video/riva/Makefile +++ b/drivers/video/riva/Makefile @@ -8,7 +8,8 @@ # Note 2! The CFLAGS definitions are now in the main makefile... O_TARGET := rivafb.o -O_OBJS := fbdev.o riva_hw.o -M_OBJS := $(O_TARGET) + +obj-y := fbdev.o riva_hw.o +obj-m := $(O_TARGET) include $(TOPDIR)/Rules.make diff --git a/drivers/video/sis/Makefile b/drivers/video/sis/Makefile index 2e657f107..9a4a23417 100644 --- a/drivers/video/sis/Makefile +++ b/drivers/video/sis/Makefile @@ -3,9 +3,9 @@ # O_TARGET := sisfb.o -O_OBJS := sis_main.o sis_300.o sis_301.o -#O_OBJS := sis_300.o -M_OBJS := $(O_TARGET) + +obj-y := sis_main.o sis_300.o sis_301.o +obj-m := $(O_TARGET) include $(TOPDIR)/Rules.make |