Commit 062dffea authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://matroxfb.bkbits.net/linux-2.5

into home.transmeta.com:/home/torvalds/v2.5/linux
parents 273cbb5a 75273dcb
...@@ -387,8 +387,7 @@ CONFIG_FB_MATROX ...@@ -387,8 +387,7 @@ CONFIG_FB_MATROX
Say Y here if you have a Matrox Millennium, Matrox Millennium II, Say Y here if you have a Matrox Millennium, Matrox Millennium II,
Matrox Mystique, Matrox Mystique 220, Matrox Productiva G100, Matrox Matrox Mystique, Matrox Mystique 220, Matrox Productiva G100, Matrox
Mystique G200, Matrox Millennium G200, Matrox Marvel G200 video, Mystique G200, Matrox Millennium G200, Matrox Marvel G200 video,
Matrox G400, G450 or G550 card in your box. At this time, support for Matrox G400, G450 or G550 card in your box.
the G-series digital output is almost non-existant.
This driver is also available as a module ( = code which can be This driver is also available as a module ( = code which can be
inserted and removed from the running kernel whenever you want). inserted and removed from the running kernel whenever you want).
...@@ -413,7 +412,7 @@ CONFIG_FB_MATROX_MYSTIQUE ...@@ -413,7 +412,7 @@ CONFIG_FB_MATROX_MYSTIQUE
packed pixel and 32 bpp packed pixel. You can also use font widths packed pixel and 32 bpp packed pixel. You can also use font widths
different from 8. different from 8.
CONFIG_FB_MATROX_G100 CONFIG_FB_MATROX_G450
Say Y here if you have a Matrox G100, G200, G400, G450 or G550 based Say Y here if you have a Matrox G100, G200, G400, G450 or G550 based
video card. If you select "Advanced lowlevel driver options", you video card. If you select "Advanced lowlevel driver options", you
should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp packed should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp packed
...@@ -423,11 +422,35 @@ CONFIG_FB_MATROX_G100 ...@@ -423,11 +422,35 @@ CONFIG_FB_MATROX_G100
If you need support for G400 secondary head, you must first say Y to If you need support for G400 secondary head, you must first say Y to
"I2C support" and "I2C bit-banging support" in the character devices "I2C support" and "I2C bit-banging support" in the character devices
section, and then to "Matrox I2C support" and "G400 second head section, and then to "Matrox I2C support" and "G400 second head
support" here in the framebuffer section. support" here in the framebuffer section. G450/G550 secondary head
and digital output are supported without additional modules.
The driver starts in monitor mode. You must use the matroxset tool
(available at <ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/>) to
swap primary and secondary head outputs, or to change output mode.
Secondary head driver always start in 640x480 resolution and you
must use fbset to change it.
Do not forget that second head supports only 16 and 32 bpp
packed pixels, so it is a good idea to compile them into the kernel
too. You can use only some font widths, as the driver uses generic
painting procedures (the secondary head does not use acceleration
engine).
If you have G550, you must also compile support for G450/G550 secondary G450/G550 hardware can display TV picture only from secondary CRTC,
head into kernel, otherwise picture will be shown only on output you and it performs no scaling, so picture must have 525 or 625 lines.
are probably not using...
CONFIG_FB_MATROX_G100A
Say Y here if you have a Matrox G100, G200 or G400 based
video card. If you select "Advanced lowlevel driver options", you
should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp packed
pixel and 32 bpp packed pixel. You can also use font widths
different from 8.
If you need support for G400 secondary head, you must first say Y to
"I2C support" and "I2C bit-banging support" in the character devices
section, and then to "Matrox I2C support" and "G400 second head
support" here in the framebuffer section.
CONFIG_FB_MATROX_I2C CONFIG_FB_MATROX_I2C
This drivers creates I2C buses which are needed for accessing the This drivers creates I2C buses which are needed for accessing the
...@@ -470,27 +493,6 @@ CONFIG_FB_MATROX_MAVEN ...@@ -470,27 +493,6 @@ CONFIG_FB_MATROX_MAVEN
painting procedures (the secondary head does not use acceleration painting procedures (the secondary head does not use acceleration
engine). engine).
CONFIG_FB_MATROX_G450
Say Y or M here if you want to use a secondary head (meaning two
monitors in parallel) on G450, or if you are using analog output
of G550.
If you compile it as module, two modules are created,
matroxfb_crtc2.o and matroxfb_g450.o. Both modules are needed if you
want two independent display devices.
The driver starts in monitor mode and currently does not support
output in TV modes. You must use the matroxset tool (available
at <ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/>) to swap
primary and secondary head outputs. Secondary head driver always
start in 640x480 resolution and you must use fbset to change it.
Also do not forget that second head supports only 16 and 32 bpp
packed pixels, so it is a good idea to compile them into the kernel
too. You can use only some font widths, as the driver uses generic
painting procedures (the secondary head does not use acceleration
engine).
CONFIG_FB_MATROX_MULTIHEAD CONFIG_FB_MATROX_MULTIHEAD
Say Y here if you have more than one (supported) Matrox device in Say Y here if you have more than one (supported) Matrox device in
your computer and you want to use all of them for different monitors your computer and you want to use all of them for different monitors
......
...@@ -130,14 +130,19 @@ if [ "$CONFIG_FB" = "y" ]; then ...@@ -130,14 +130,19 @@ if [ "$CONFIG_FB" = "y" ]; then
if [ "$CONFIG_FB_MATROX" != "n" ]; then if [ "$CONFIG_FB_MATROX" != "n" ]; then
bool ' Millennium I/II support' CONFIG_FB_MATROX_MILLENIUM bool ' Millennium I/II support' CONFIG_FB_MATROX_MILLENIUM
bool ' Mystique support' CONFIG_FB_MATROX_MYSTIQUE bool ' Mystique support' CONFIG_FB_MATROX_MYSTIQUE
bool ' G100/G200/G400/G450/G550 support' CONFIG_FB_MATROX_G100 bool ' G100/G200/G400/G450/G550 support' CONFIG_FB_MATROX_G450
if [ "$CONFIG_FB_MATROX_G450" = "n" ]; then
bool ' G100/G200/G400 support' CONFIG_FB_MATROX_G100A
fi
if [ "$CONFIG_FB_MATROX_G450" = "y" -o "$CONFIG_FB_MATROX_G100A" = "y" ]; then
define_bool CONFIG_FB_MATROX_G100 y
fi
if [ "$CONFIG_I2C" != "n" ]; then if [ "$CONFIG_I2C" != "n" ]; then
dep_tristate ' Matrox I2C support' CONFIG_FB_MATROX_I2C $CONFIG_FB_MATROX $CONFIG_I2C_ALGOBIT dep_tristate ' Matrox I2C support' CONFIG_FB_MATROX_I2C $CONFIG_FB_MATROX $CONFIG_I2C_ALGOBIT
if [ "$CONFIG_FB_MATROX_G100" = "y" ]; then if [ "$CONFIG_FB_MATROX_G100" = "y" ]; then
dep_tristate ' G400 second head support' CONFIG_FB_MATROX_MAVEN $CONFIG_FB_MATROX_I2C dep_tristate ' G400 second head support' CONFIG_FB_MATROX_MAVEN $CONFIG_FB_MATROX_I2C
fi fi
fi fi
dep_tristate ' G450/G550 second head support (mandatory for G550)' CONFIG_FB_MATROX_G450 $CONFIG_FB_MATROX_G100
bool ' Multihead support' CONFIG_FB_MATROX_MULTIHEAD bool ' Multihead support' CONFIG_FB_MATROX_MULTIHEAD
fi fi
tristate ' ATI Mach64 display support (EXPERIMENTAL)' CONFIG_FB_ATY tristate ' ATI Mach64 display support (EXPERIMENTAL)' CONFIG_FB_ATY
......
...@@ -5,16 +5,16 @@ ...@@ -5,16 +5,16 @@
# All of the (potential) objects that export symbols. # All of the (potential) objects that export symbols.
# This list comes from 'grep -l EXPORT_SYMBOL *.[hc]'. # 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 g450_pll.o export-objs := matroxfb_base.o matroxfb_accel.o matroxfb_DAC1064.o matroxfb_Ti3026.o matroxfb_misc.o g450_pll.o matroxfb_g450.o
# Each configuration option enables a list of files. # Each configuration option enables a list of files.
my-obj-$(CONFIG_FB_MATROX_G100) := g450_pll.o my-obj-$(CONFIG_FB_MATROX_G100) += g450_pll.o
my-obj-$(CONFIG_FB_MATROX_G450) += matroxfb_g450.o matroxfb_crtc2.o
obj-$(CONFIG_FB_MATROX) += matroxfb_base.o matroxfb_accel.o matroxfb_DAC1064.o matroxfb_Ti3026.o matroxfb_misc.o $(my-obj-y) obj-$(CONFIG_FB_MATROX) += matroxfb_base.o matroxfb_accel.o matroxfb_DAC1064.o matroxfb_Ti3026.o matroxfb_misc.o $(my-obj-y)
obj-$(CONFIG_FB_MATROX_I2C) += i2c-matroxfb.o obj-$(CONFIG_FB_MATROX_I2C) += i2c-matroxfb.o
obj-$(CONFIG_FB_MATROX_MAVEN) += matroxfb_maven.o matroxfb_crtc2.o obj-$(CONFIG_FB_MATROX_MAVEN) += matroxfb_maven.o matroxfb_crtc2.o
obj-$(CONFIG_FB_MATROX_G450) += matroxfb_g450.o matroxfb_crtc2.o
include $(TOPDIR)/Rules.make include $(TOPDIR)/Rules.make
......
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
* *
* Hardware accelerated Matrox PCI cards - G450/G550 PLL control. * Hardware accelerated Matrox PCI cards - G450/G550 PLL control.
* *
* (c) 2001 Petr Vandrovec <vandrove@vc.cvut.cz> * (c) 2001-2002 Petr Vandrovec <vandrove@vc.cvut.cz>
* *
* Portions Copyright (c) 2001 Matrox Graphics Inc. * Portions Copyright (c) 2001 Matrox Graphics Inc.
* *
* Version: 1.62 2001/11/29 * Version: 1.64 2002/06/10
* *
* This file is subject to the terms and conditions of the GNU General Public * 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 * License. See the file COPYING in the main directory of this archive for
...@@ -33,6 +33,10 @@ static unsigned int g450_mnp2vco(CPMINFO unsigned int mnp) { ...@@ -33,6 +33,10 @@ static unsigned int g450_mnp2vco(CPMINFO unsigned int mnp) {
return (ACCESS_FBINFO(features).pll.ref_freq * n + (m >> 1)) / m; return (ACCESS_FBINFO(features).pll.ref_freq * n + (m >> 1)) / m;
} }
unsigned int g450_mnp2f(CPMINFO unsigned int mnp) {
return g450_vco2f(mnp, g450_mnp2vco(PMINFO mnp));
}
static inline unsigned int pll_freq_delta(unsigned int f1, unsigned int f2) { static inline unsigned int pll_freq_delta(unsigned int f1, unsigned int f2) {
if (f2 < f1) { if (f2 < f1) {
f2 = f1 - f2; f2 = f1 - f2;
...@@ -52,40 +56,42 @@ static unsigned int g450_nextpll(CPMINFO const struct matrox_pll_limits* pi, uns ...@@ -52,40 +56,42 @@ static unsigned int g450_nextpll(CPMINFO const struct matrox_pll_limits* pi, uns
m = (mnp >> 16) & 0xFF; m = (mnp >> 16) & 0xFF;
p = mnp & 0xFF; p = mnp & 0xFF;
if (m == 0 || m == 0xFF) { do {
if (m == 0) { if (m == 0 || m == 0xFF) {
if (p & 0x40) { if (m == 0) {
return NO_MORE_MNP; if (p & 0x40) {
return NO_MORE_MNP;
}
if (p & 3) {
p--;
} else {
p = 0x40;
}
tvco >>= 1;
if (tvco < pi->vcomin) {
return NO_MORE_MNP;
}
*fvco = tvco;
} }
if (p & 3) {
p--; p &= 0x43;
if (tvco < 550000) {
/* p |= 0x00; */
} else if (tvco < 700000) {
p |= 0x08;
} else if (tvco < 1000000) {
p |= 0x10;
} else if (tvco < 1150000) {
p |= 0x18;
} else { } else {
p = 0x40; p |= 0x20;
} }
tvco >>= 1; m = 9;
if (tvco < pi->vcomin) {
return NO_MORE_MNP;
}
*fvco = tvco;
}
p &= 0x43;
if (tvco < 550000) {
/* p |= 0x00; */
} else if (tvco < 700000) {
p |= 0x08;
} else if (tvco < 1000000) {
p |= 0x10;
} else if (tvco < 1150000) {
p |= 0x18;
} else { } else {
p |= 0x20; m--;
} }
m = 9; n = ((tvco * (m+1) + ACCESS_FBINFO(features).pll.ref_freq) / (ACCESS_FBINFO(features).pll.ref_freq * 2)) - 2;
} else { } while (n < 0x03 || n > 0x7A);
m--;
}
n = ((tvco * (m+1) + ACCESS_FBINFO(features).pll.ref_freq) / (ACCESS_FBINFO(features).pll.ref_freq * 2)) - 2;
return (m << 16) | (n << 8) | p; return (m << 16) | (n << 8) | p;
} }
...@@ -219,7 +225,7 @@ static void updatehwstate_clk(struct matrox_hw_state* hw, unsigned int mnp, unsi ...@@ -219,7 +225,7 @@ static void updatehwstate_clk(struct matrox_hw_state* hw, unsigned int mnp, unsi
} }
} }
static inline void g450_setpll_cond(WPMINFO unsigned int mnp, unsigned int pll) { void matroxfb_g450_setpll_cond(WPMINFO unsigned int mnp, unsigned int pll) {
if (g450_cmppll(PMINFO mnp, pll)) { if (g450_cmppll(PMINFO mnp, pll)) {
g450_setpll(PMINFO mnp, pll); g450_setpll(PMINFO mnp, pll);
} }
...@@ -385,10 +391,8 @@ static int __g450_setclk(WPMINFO unsigned int fout, unsigned int pll, ...@@ -385,10 +391,8 @@ static int __g450_setclk(WPMINFO unsigned int fout, unsigned int pll,
unsigned int vco; unsigned int vco;
unsigned int delta; unsigned int delta;
if ((mnp & 0xFF00) < 0x0300 || (mnp & 0xFF00) > 0x7A00) {
continue;
}
vco = g450_mnp2vco(PMINFO mnp); vco = g450_mnp2vco(PMINFO mnp);
#if 0
if (pll == M_VIDEO_PLL) { if (pll == M_VIDEO_PLL) {
unsigned int big, small; unsigned int big, small;
...@@ -406,6 +410,7 @@ static int __g450_setclk(WPMINFO unsigned int fout, unsigned int pll, ...@@ -406,6 +410,7 @@ static int __g450_setclk(WPMINFO unsigned int fout, unsigned int pll,
continue; continue;
} }
} }
#endif
delta = pll_freq_delta(fout, g450_vco2f(mnp, vco)); delta = pll_freq_delta(fout, g450_vco2f(mnp, vco));
for (idx = mnpcount; idx > 0; idx--) { for (idx = mnpcount; idx > 0; idx--) {
/* == is important; due to nextpll algorithm we get /* == is important; due to nextpll algorithm we get
...@@ -426,7 +431,7 @@ static int __g450_setclk(WPMINFO unsigned int fout, unsigned int pll, ...@@ -426,7 +431,7 @@ static int __g450_setclk(WPMINFO unsigned int fout, unsigned int pll,
} }
/* VideoPLL and PixelPLL matched: do nothing... In all other cases we should get at least one frequency */ /* VideoPLL and PixelPLL matched: do nothing... In all other cases we should get at least one frequency */
if (!mnpcount) { if (!mnpcount) {
return 1; return -EBUSY;
} }
{ {
unsigned long flags; unsigned long flags;
...@@ -435,15 +440,15 @@ static int __g450_setclk(WPMINFO unsigned int fout, unsigned int pll, ...@@ -435,15 +440,15 @@ static int __g450_setclk(WPMINFO unsigned int fout, unsigned int pll,
matroxfb_DAC_lock_irqsave(flags); matroxfb_DAC_lock_irqsave(flags);
mnp = g450_checkcache(PMINFO ci, mnparray[0]); mnp = g450_checkcache(PMINFO ci, mnparray[0]);
if (mnp != NO_MORE_MNP) { if (mnp != NO_MORE_MNP) {
g450_setpll_cond(PMINFO mnp, pll); matroxfb_g450_setpll_cond(PMINFO mnp, pll);
} else { } else {
mnp = g450_findworkingpll(PMINFO pll, mnparray, mnpcount); mnp = g450_findworkingpll(PMINFO pll, mnparray, mnpcount);
g450_addcache(ci, mnparray[0], mnp); g450_addcache(ci, mnparray[0], mnp);
} }
updatehwstate_clk(&ACCESS_FBINFO(hw), mnp, pll); updatehwstate_clk(&ACCESS_FBINFO(hw), mnp, pll);
matroxfb_DAC_unlock_irqrestore(flags); matroxfb_DAC_unlock_irqrestore(flags);
return mnp;
} }
return 0;
} }
/* It must be greater than number of possible PLL values. /* It must be greater than number of possible PLL values.
...@@ -465,8 +470,10 @@ int matroxfb_g450_setclk(WPMINFO unsigned int fout, unsigned int pll) { ...@@ -465,8 +470,10 @@ int matroxfb_g450_setclk(WPMINFO unsigned int fout, unsigned int pll) {
} }
EXPORT_SYMBOL(matroxfb_g450_setclk); EXPORT_SYMBOL(matroxfb_g450_setclk);
EXPORT_SYMBOL(g450_mnp2f);
EXPORT_SYMBOL(matroxfb_g450_setpll_cond);
MODULE_AUTHOR("(c) 2001 Petr Vandrovec <vandrove@vc.cvut.cz>"); MODULE_AUTHOR("(c) 2001-2002 Petr Vandrovec <vandrove@vc.cvut.cz>");
MODULE_DESCRIPTION("Matrox G450/G550 PLL driver"); MODULE_DESCRIPTION("Matrox G450/G550 PLL driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -4,5 +4,7 @@ ...@@ -4,5 +4,7 @@
#include "matroxfb_base.h" #include "matroxfb_base.h"
int matroxfb_g450_setclk(WPMINFO unsigned int fout, unsigned int pll); int matroxfb_g450_setclk(WPMINFO unsigned int fout, unsigned int pll);
unsigned int g450_mnp2f(CPMINFO unsigned int mnp);
void matroxfb_g450_setpll_cond(WPMINFO unsigned int mnp, unsigned int pll);
#endif /* __G450_PLL_H__ */ #endif /* __G450_PLL_H__ */
This diff is collapsed.
This diff is collapsed.
...@@ -146,6 +146,8 @@ void DAC1064_global_restore(WPMINFO2); ...@@ -146,6 +146,8 @@ void DAC1064_global_restore(WPMINFO2);
#define M1064_XPWRCTRL 0xA0 #define M1064_XPWRCTRL 0xA0
#define M1064_XPANMODE 0xA2
enum POS1064 { enum POS1064 {
POS1064_XCURADDL=0, POS1064_XCURADDH, POS1064_XCURCTRL, POS1064_XCURADDL=0, POS1064_XCURADDH, POS1064_XCURCTRL,
POS1064_XCURCOL0RED, POS1064_XCURCOL0GREEN, POS1064_XCURCOL0BLUE, POS1064_XCURCOL0RED, POS1064_XCURCOL0GREEN, POS1064_XCURCOL0BLUE,
...@@ -156,7 +158,7 @@ enum POS1064 { ...@@ -156,7 +158,7 @@ enum POS1064 {
POS1064_XGENIOCTRL, POS1064_XGENIODATA, POS1064_XZOOMCTRL, POS1064_XSENSETEST, POS1064_XGENIOCTRL, POS1064_XGENIODATA, POS1064_XZOOMCTRL, POS1064_XSENSETEST,
POS1064_XCRCBITSEL, POS1064_XCRCBITSEL,
POS1064_XCOLKEYMASKL, POS1064_XCOLKEYMASKH, POS1064_XCOLKEYL, POS1064_XCOLKEYH, POS1064_XCOLKEYMASKL, POS1064_XCOLKEYMASKH, POS1064_XCOLKEYL, POS1064_XCOLKEYH,
POS1064_XOUTPUTCONN }; POS1064_XOUTPUTCONN, POS1064_XPANMODE, POS1064_XPWRCTRL };
#endif /* __MATROXFB_DAC1064_H__ */ #endif /* __MATROXFB_DAC1064_H__ */
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
* *
* Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200 and G400 * Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200 and G400
* *
* (c) 1998,1999,2000 Petr Vandrovec <vandrove@vc.cvut.cz> * (c) 1998-2002 Petr Vandrovec <vandrove@vc.cvut.cz>
* *
* Portions Copyright (c) 2001 Matrox Graphics Inc. * Portions Copyright (c) 2001 Matrox Graphics Inc.
* *
* Version: 1.62 2000/11/29 * Version: 1.65 2002/08/14
* *
* MTRR stuff: 1998 Tom Rini <trini@kernel.crashing.org> * MTRR stuff: 1998 Tom Rini <trini@kernel.crashing.org>
* *
...@@ -84,6 +84,7 @@ ...@@ -84,6 +84,7 @@
#include "matroxfb_Ti3026.h" #include "matroxfb_Ti3026.h"
#include "matroxfb_misc.h" #include "matroxfb_misc.h"
#include "matroxfb_accel.h" #include "matroxfb_accel.h"
#include <linux/matroxfb.h>
#ifdef CONFIG_FB_MATROX_MILLENIUM #ifdef CONFIG_FB_MATROX_MILLENIUM
#define outTi3026 matroxfb_DAC_out #define outTi3026 matroxfb_DAC_out
...@@ -401,7 +402,7 @@ static int matroxfb_ti3026_setfont(struct display* p, int width, int height) { ...@@ -401,7 +402,7 @@ static int matroxfb_ti3026_setfont(struct display* p, int width, int height) {
return 0; return 0;
} }
static int matroxfb_ti3026_selhwcursor(WPMINFO struct display* p) { static int matroxfb_ti3026_selhwcursor(WPMINFO2) {
ACCESS_FBINFO(dispsw.cursor) = matroxfb_ti3026_cursor; ACCESS_FBINFO(dispsw.cursor) = matroxfb_ti3026_cursor;
ACCESS_FBINFO(dispsw.set_font) = matroxfb_ti3026_setfont; ACCESS_FBINFO(dispsw.set_font) = matroxfb_ti3026_setfont;
return 0; return 0;
...@@ -433,7 +434,7 @@ static int Ti3026_setpclk(WPMINFO int clk, struct display* p) { ...@@ -433,7 +434,7 @@ static int Ti3026_setpclk(WPMINFO int clk, struct display* p) {
hw->DACclk[1] = pixfeed; hw->DACclk[1] = pixfeed;
hw->DACclk[2] = pixpost | 0xB0; hw->DACclk[2] = pixpost | 0xB0;
if (p->type == FB_TYPE_TEXT) { if (ACCESS_FBINFO(fbcon).fix.type == FB_TYPE_TEXT) {
hw->DACreg[POS3026_XMEMPLLCTRL] = TVP3026_XMEMPLLCTRL_MCLK_MCLKPLL | TVP3026_XMEMPLLCTRL_RCLK_PIXPLL; hw->DACreg[POS3026_XMEMPLLCTRL] = TVP3026_XMEMPLLCTRL_MCLK_MCLKPLL | TVP3026_XMEMPLLCTRL_RCLK_PIXPLL;
hw->DACclk[3] = 0xFD; hw->DACclk[3] = 0xFD;
hw->DACclk[4] = 0x3D; hw->DACclk[4] = 0x3D;
...@@ -501,7 +502,7 @@ static int Ti3026_init(WPMINFO struct my_timming* m, struct display* p) { ...@@ -501,7 +502,7 @@ static int Ti3026_init(WPMINFO struct my_timming* m, struct display* p) {
DBG("Ti3026_init") DBG("Ti3026_init")
memcpy(hw->DACreg, MGADACbpp32, sizeof(hw->DACreg)); memcpy(hw->DACreg, MGADACbpp32, sizeof(hw->DACreg));
if (p->type == FB_TYPE_TEXT) { if (ACCESS_FBINFO(fbcon).fix.type == FB_TYPE_TEXT) {
hw->DACreg[POS3026_XLATCHCTRL] = TVP3026_XLATCHCTRL_8_1; hw->DACreg[POS3026_XLATCHCTRL] = TVP3026_XLATCHCTRL_8_1;
hw->DACreg[POS3026_XTRUECOLORCTRL] = TVP3026_XTRUECOLORCTRL_PSEUDOCOLOR; hw->DACreg[POS3026_XTRUECOLORCTRL] = TVP3026_XTRUECOLORCTRL_PSEUDOCOLOR;
hw->DACreg[POS3026_XMUXCTRL] = TVP3026_XMUXCTRL_VGA; hw->DACreg[POS3026_XMUXCTRL] = TVP3026_XMUXCTRL_VGA;
...@@ -568,7 +569,7 @@ static int Ti3026_init(WPMINFO struct my_timming* m, struct display* p) { ...@@ -568,7 +569,7 @@ static int Ti3026_init(WPMINFO struct my_timming* m, struct display* p) {
/* set interleaving */ /* set interleaving */
hw->MXoptionReg &= ~0x00001000; hw->MXoptionReg &= ~0x00001000;
if ((p->type != FB_TYPE_TEXT) && isInterleave(MINFO)) hw->MXoptionReg |= 0x00001000; if ((ACCESS_FBINFO(fbcon).fix.type != FB_TYPE_TEXT) && isInterleave(MINFO)) hw->MXoptionReg |= 0x00001000;
/* set DAC */ /* set DAC */
Ti3026_setpclk(PMINFO m->pixclock, p); Ti3026_setpclk(PMINFO m->pixclock, p);
...@@ -811,6 +812,10 @@ static void Ti3026_reset(WPMINFO2) { ...@@ -811,6 +812,10 @@ static void Ti3026_reset(WPMINFO2) {
ti3026_ramdac_init(PMINFO2); ti3026_ramdac_init(PMINFO2);
} }
static struct matrox_altout ti3026_output = {
.name = "Primary output",
};
static int Ti3026_preinit(WPMINFO2) { static int Ti3026_preinit(WPMINFO2) {
static const int vxres_mill2[] = { 512, 640, 768, 800, 832, 960, static const int vxres_mill2[] = { 512, 640, 768, 800, 832, 960,
1024, 1152, 1280, 1600, 1664, 1920, 1024, 1152, 1280, 1600, 1664, 1920,
...@@ -829,6 +834,11 @@ static int Ti3026_preinit(WPMINFO2) { ...@@ -829,6 +834,11 @@ static int Ti3026_preinit(WPMINFO2) {
ACCESS_FBINFO(capable.vxres) = isMilleniumII(MINFO)?vxres_mill2:vxres_mill1; ACCESS_FBINFO(capable.vxres) = isMilleniumII(MINFO)?vxres_mill2:vxres_mill1;
ACCESS_FBINFO(cursor.timer.function) = matroxfb_ti3026_flashcursor; ACCESS_FBINFO(cursor.timer.function) = matroxfb_ti3026_flashcursor;
ACCESS_FBINFO(outputs[0]).data = MINFO;
ACCESS_FBINFO(outputs[0]).output = &ti3026_output;
ACCESS_FBINFO(outputs[0]).src = MATROXFB_SRC_CRTC1;
ACCESS_FBINFO(outputs[0]).mode = MATROXFB_OUTPUT_MODE_MONITOR;
if (ACCESS_FBINFO(devflags.noinit)) if (ACCESS_FBINFO(devflags.noinit))
return 0; return 0;
/* preserve VGA I/O, BIOS and PPC */ /* preserve VGA I/O, BIOS and PPC */
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
* *
* Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200 and G400 * Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200 and G400
* *
* (c) 1998-2001 Petr Vandrovec <vandrove@vc.cvut.cz> * (c) 1998-2002 Petr Vandrovec <vandrove@vc.cvut.cz>
* *
* Version: 1.51 2001/06/18 * Version: 1.65 2002/08/14
* *
* MTRR stuff: 1998 Tom Rini <trini@kernel.crashing.org> * MTRR stuff: 1998 Tom Rini <trini@kernel.crashing.org>
* *
...@@ -85,21 +85,21 @@ ...@@ -85,21 +85,21 @@
#define mga_ydstlen(y,l) mga_outl(M_YDSTLEN | M_EXEC, ((y) << 16) | (l)) #define mga_ydstlen(y,l) mga_outl(M_YDSTLEN | M_EXEC, ((y) << 16) | (l))
void matrox_cfbX_init(WPMINFO struct display* p) { void matrox_cfbX_init(WPMINFO2) {
u_int32_t maccess; u_int32_t maccess;
u_int32_t mpitch; u_int32_t mpitch;
u_int32_t mopmode; u_int32_t mopmode;
DBG("matrox_cfbX_init") DBG("matrox_cfbX_init")
mpitch = p->var.xres_virtual; mpitch = ACCESS_FBINFO(fbcon).var.xres_virtual;
if (p->type == FB_TYPE_TEXT) { if (ACCESS_FBINFO(fbcon).fix.type == FB_TYPE_TEXT) {
maccess = 0x00000000; maccess = 0x00000000;
mpitch = (mpitch >> 4) | 0x8000; /* set something */ mpitch = (mpitch >> 4) | 0x8000; /* set something */
mopmode = M_OPMODE_8BPP; mopmode = M_OPMODE_8BPP;
} else { } else {
switch (p->var.bits_per_pixel) { switch (ACCESS_FBINFO(fbcon).var.bits_per_pixel) {
case 4: maccess = 0x00000000; /* accelerate as 8bpp video */ case 4: maccess = 0x00000000; /* accelerate as 8bpp video */
mpitch = (mpitch >> 1) | 0x8000; /* disable linearization */ mpitch = (mpitch >> 1) | 0x8000; /* disable linearization */
mopmode = M_OPMODE_4BPP; mopmode = M_OPMODE_4BPP;
...@@ -107,7 +107,7 @@ void matrox_cfbX_init(WPMINFO struct display* p) { ...@@ -107,7 +107,7 @@ void matrox_cfbX_init(WPMINFO struct display* p) {
case 8: maccess = 0x00000000; case 8: maccess = 0x00000000;
mopmode = M_OPMODE_8BPP; mopmode = M_OPMODE_8BPP;
break; break;
case 16: if (p->var.green.length == 5) case 16: if (ACCESS_FBINFO(fbcon).var.green.length == 5)
maccess = 0xC0000001; maccess = 0xC0000001;
else else
maccess = 0x40000001; maccess = 0x40000001;
...@@ -816,7 +816,7 @@ static void matrox_cfbX_clear_margins(struct vc_data* conp, struct display* p, i ...@@ -816,7 +816,7 @@ static void matrox_cfbX_clear_margins(struct vc_data* conp, struct display* p, i
static void matrox_text_setup(struct display* p) { static void matrox_text_setup(struct display* p) {
MINFO_FROM_DISP(p); MINFO_FROM_DISP(p);
p->next_line = p->line_length ? p->line_length : ((p->var.xres_virtual / (fontwidth(p)?fontwidth(p):8)) * ACCESS_FBINFO(devflags.textstep)); p->next_line = ACCESS_FBINFO(fbcon).fix.line_length ? ACCESS_FBINFO(fbcon).fix.line_length : ((p->var.xres_virtual / (fontwidth(p)?fontwidth(p):8)) * ACCESS_FBINFO(devflags.textstep));
p->next_plane = 0; p->next_plane = 0;
} }
...@@ -1040,7 +1040,7 @@ static int matrox_text_setfont(struct display* p, int width, int height) { ...@@ -1040,7 +1040,7 @@ static int matrox_text_setfont(struct display* p, int width, int height) {
MINFO_FROM_DISP(p); MINFO_FROM_DISP(p);
matrox_text_round(PMINFO &p->var, p); matrox_text_round(PMINFO &p->var, p);
p->next_line = p->line_length = ((p->var.xres_virtual / (fontwidth(p)?fontwidth(p):8)) * ACCESS_FBINFO(devflags.textstep)); p->next_line = ACCESS_FBINFO(fbcon).fix.line_length = ((p->var.xres_virtual / (fontwidth(p)?fontwidth(p):8)) * ACCESS_FBINFO(devflags.textstep));
if (p->conp) if (p->conp)
matrox_text_createcursor(PMINFO p); matrox_text_createcursor(PMINFO p);
...@@ -1144,11 +1144,11 @@ void initMatrox(WPMINFO struct display* p) { ...@@ -1144,11 +1144,11 @@ void initMatrox(WPMINFO struct display* p) {
if (p->dispsw && p->conp) if (p->dispsw && p->conp)
fb_con.con_cursor(p->conp, CM_ERASE); fb_con.con_cursor(p->conp, CM_ERASE);
p->dispsw_data = NULL; p->dispsw_data = NULL;
if ((p->var.accel_flags & FB_ACCELF_TEXT) != FB_ACCELF_TEXT) { if ((ACCESS_FBINFO(fbcon).var.accel_flags & FB_ACCELF_TEXT) != FB_ACCELF_TEXT) {
if (p->type == FB_TYPE_TEXT) { if (ACCESS_FBINFO(fbcon).fix.type == FB_TYPE_TEXT) {
swtmp = &matroxfb_text; swtmp = &matroxfb_text;
} else { } else {
switch (p->var.bits_per_pixel) { switch (ACCESS_FBINFO(fbcon).var.bits_per_pixel) {
#ifdef FBCON_HAS_CFB4 #ifdef FBCON_HAS_CFB4
case 4: case 4:
swtmp = &fbcon_cfb4; swtmp = &fbcon_cfb4;
...@@ -1183,10 +1183,10 @@ void initMatrox(WPMINFO struct display* p) { ...@@ -1183,10 +1183,10 @@ void initMatrox(WPMINFO struct display* p) {
} }
} }
dprintk(KERN_INFO "matroxfb: acceleration disabled\n"); dprintk(KERN_INFO "matroxfb: acceleration disabled\n");
} else if (p->type == FB_TYPE_TEXT) { } else if (ACCESS_FBINFO(fbcon).fix.type == FB_TYPE_TEXT) {
swtmp = &matroxfb_text; swtmp = &matroxfb_text;
} else { } else {
switch (p->var.bits_per_pixel) { switch (ACCESS_FBINFO(fbcon).var.bits_per_pixel) {
#ifdef FBCON_HAS_CFB4 #ifdef FBCON_HAS_CFB4
case 4: case 4:
swtmp = &matroxfb_cfb4; swtmp = &matroxfb_cfb4;
...@@ -1222,8 +1222,8 @@ void initMatrox(WPMINFO struct display* p) { ...@@ -1222,8 +1222,8 @@ void initMatrox(WPMINFO struct display* p) {
} }
memcpy(&ACCESS_FBINFO(dispsw), swtmp, sizeof(ACCESS_FBINFO(dispsw))); memcpy(&ACCESS_FBINFO(dispsw), swtmp, sizeof(ACCESS_FBINFO(dispsw)));
p->dispsw = &ACCESS_FBINFO(dispsw); p->dispsw = &ACCESS_FBINFO(dispsw);
if ((p->type != FB_TYPE_TEXT) && ACCESS_FBINFO(devflags.hwcursor)) { if ((ACCESS_FBINFO(fbcon).fix.type != FB_TYPE_TEXT) && ACCESS_FBINFO(devflags.hwcursor)) {
ACCESS_FBINFO(hw_switch)->selhwcursor(PMINFO p); ACCESS_FBINFO(hw_switch)->selhwcursor(PMINFO2);
} }
} }
...@@ -1233,7 +1233,7 @@ void matrox_init_putc(WPMINFO struct display* p, void (*dac_createcursor)(WPMINF ...@@ -1233,7 +1233,7 @@ void matrox_init_putc(WPMINFO struct display* p, void (*dac_createcursor)(WPMINF
int i; int i;
if (p && p->conp) { if (p && p->conp) {
if (p->type == FB_TYPE_TEXT) { if (ACCESS_FBINFO(fbcon).fix.type == FB_TYPE_TEXT) {
matrox_text_createcursor(PMINFO p); matrox_text_createcursor(PMINFO p);
matrox_text_loadfont(PMINFO p); matrox_text_loadfont(PMINFO p);
i = 0; i = 0;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "matroxfb_base.h" #include "matroxfb_base.h"
void matrox_init_putc(WPMINFO struct display* p, void (*)(WPMINFO struct display *p)); void matrox_init_putc(WPMINFO struct display* p, void (*)(WPMINFO struct display *p));
void matrox_cfbX_init(WPMINFO struct display* p); void matrox_cfbX_init(WPMINFO2);
void matrox_text_round(CPMINFO struct fb_var_screeninfo* var, struct display* p); void matrox_text_round(CPMINFO struct fb_var_screeninfo* var, struct display* p);
void initMatrox(WPMINFO struct display* p); void initMatrox(WPMINFO struct display* p);
......
This diff is collapsed.
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200, G400 and G450 * Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200, G400 and G450
* *
* (c) 1998,1999,2000,2001 Petr Vandrovec <vandrove@vc.cvut.cz> * (c) 1998-2002 Petr Vandrovec <vandrove@vc.cvut.cz>
* *
*/ */
#ifndef __MATROXFB_H__ #ifndef __MATROXFB_H__
...@@ -288,6 +288,8 @@ static inline void mga_iounmap(vaddr_t va) { ...@@ -288,6 +288,8 @@ static inline void mga_iounmap(vaddr_t va) {
struct my_timming { struct my_timming {
unsigned int pixclock; unsigned int pixclock;
int mnp;
unsigned int crtc;
unsigned int HDisplay; unsigned int HDisplay;
unsigned int HSyncStart; unsigned int HSyncStart;
unsigned int HSyncEnd; unsigned int HSyncEnd;
...@@ -364,6 +366,10 @@ struct mavenregs { ...@@ -364,6 +366,10 @@ struct mavenregs {
u_int16_t hcorr; u_int16_t hcorr;
}; };
struct matrox_crtc2 {
u_int32_t ctl;
};
struct matrox_hw_state { struct matrox_hw_state {
u_int32_t MXoptionReg; u_int32_t MXoptionReg;
unsigned char DACclk[6]; unsigned char DACclk[6];
...@@ -381,10 +387,7 @@ struct matrox_hw_state { ...@@ -381,10 +387,7 @@ struct matrox_hw_state {
/* TVOut only */ /* TVOut only */
struct mavenregs maven; struct mavenregs maven;
/* CRTC2 only */ struct matrox_crtc2 crtc2;
/* u_int32_t TBD */
unsigned int vidclk;
}; };
struct matrox_accel_data { struct matrox_accel_data {
...@@ -396,15 +399,17 @@ struct matrox_accel_data { ...@@ -396,15 +399,17 @@ struct matrox_accel_data {
}; };
struct matrox_altout { struct matrox_altout {
const char *name;
int (*compute)(void* altout_dev, struct my_timming* input); int (*compute)(void* altout_dev, struct my_timming* input);
int (*program)(void* altout_dev); int (*program)(void* altout_dev);
int (*start)(void* altout_dev); int (*start)(void* altout_dev);
void (*incuse)(void* altout_dev); int (*verifymode)(void* altout_dev, u_int32_t mode);
void (*decuse)(void* altout_dev);
int (*setmode)(void* altout_dev, u_int32_t mode);
int (*getmode)(void* altout_dev, u_int32_t* mode);
}; };
#define MATROXFB_SRC_NONE 0
#define MATROXFB_SRC_CRTC1 1
#define MATROXFB_SRC_CRTC2 2
enum mga_chip { MGA_2064, MGA_2164, MGA_1064, MGA_1164, MGA_G100, MGA_G200, MGA_G400, MGA_G450, MGA_G550 }; enum mga_chip { MGA_2064, MGA_2164, MGA_1064, MGA_1164, MGA_G100, MGA_G200, MGA_G400, MGA_G450, MGA_G550 };
struct matrox_bios { struct matrox_bios {
...@@ -421,9 +426,9 @@ struct matrox_bios { ...@@ -421,9 +426,9 @@ struct matrox_bios {
struct matrox_switch; struct matrox_switch;
struct matroxfb_driver; struct matroxfb_driver;
struct matroxfb_dh_fb_info;
struct matrox_fb_info { struct matrox_fb_info {
/* fb_info must be first */
struct fb_info fbcon; struct fb_info fbcon;
struct list_head next_fb; struct list_head next_fb;
...@@ -439,20 +444,25 @@ struct matrox_fb_info { ...@@ -439,20 +444,25 @@ struct matrox_fb_info {
struct pci_dev* pcidev; struct pci_dev* pcidev;
struct { struct {
u_int32_t all; unsigned int pixclock;
u_int32_t ph; int mnp;
u_int32_t sh; } crtc1;
} output;
struct matrox_altout* primout;
struct { struct {
struct fb_info* info; unsigned int pixclock;
int mnp;
struct matroxfb_dh_fb_info* info;
struct rw_semaphore lock; struct rw_semaphore lock;
} crtc2; } crtc2;
struct { struct {
struct matrox_altout* output; struct rw_semaphore lock;
void* device;
struct rw_semaphore lock;
} altout; } altout;
#define MATROXFB_MAX_OUTPUTS 3
struct {
unsigned int src;
struct matrox_altout* output;
void* data;
unsigned int mode;
} outputs[MATROXFB_MAX_OUTPUTS];
#define MATROXFB_MAX_FB_DRIVERS 5 #define MATROXFB_MAX_FB_DRIVERS 5
struct matroxfb_driver* (drivers[MATROXFB_MAX_FB_DRIVERS]); struct matroxfb_driver* (drivers[MATROXFB_MAX_FB_DRIVERS]);
...@@ -541,6 +551,8 @@ struct matrox_fb_info { ...@@ -541,6 +551,8 @@ struct matrox_fb_info {
int memtype; int memtype;
int g450dac; int g450dac;
int dfp_type; int dfp_type;
int panellink; /* G400 DFP possible (not G450/G550) */
int dualhead;
unsigned int fbResource; unsigned int fbResource;
} devflags; } devflags;
struct display_switch dispsw; struct display_switch dispsw;
...@@ -618,7 +630,7 @@ struct matrox_fb_info { ...@@ -618,7 +630,7 @@ struct matrox_fb_info {
#define PMINFO PMINFO2 , #define PMINFO PMINFO2 ,
static inline struct matrox_fb_info* mxinfo(const struct display* p) { static inline struct matrox_fb_info* mxinfo(const struct display* p) {
return (struct matrox_fb_info*)p->fb_info; return container_of(p->fb_info, struct matrox_fb_info, fbcon);
} }
#define PMXINFO(p) mxinfo(p), #define PMXINFO(p) mxinfo(p),
...@@ -658,7 +670,7 @@ struct matrox_switch { ...@@ -658,7 +670,7 @@ struct matrox_switch {
void (*reset)(WPMINFO2); void (*reset)(WPMINFO2);
int (*init)(WPMINFO struct my_timming*, struct display*); int (*init)(WPMINFO struct my_timming*, struct display*);
void (*restore)(WPMINFO struct display*); void (*restore)(WPMINFO struct display*);
int (*selhwcursor)(WPMINFO struct display*); int (*selhwcursor)(WPMINFO2);
}; };
struct matroxfb_driver { struct matroxfb_driver {
......
This diff is collapsed.
...@@ -27,8 +27,9 @@ struct matroxfb_dh_fb_info { ...@@ -27,8 +27,9 @@ struct matroxfb_dh_fb_info {
unsigned int len; unsigned int len;
} mmio; } mmio;
int currcon;
struct display* currcon_display; struct display* currcon_display;
int interlaced:1;
union { union {
#ifdef FBCON_HAS_CFB16 #ifdef FBCON_HAS_CFB16
......
This diff is collapsed.
#ifndef __MATROXFB_G450_H__ #ifndef __MATROXFB_G450_H__
#define __MATROXFB_G450_H__ #define __MATROXFB_G450_H__
#include <linux/ioctl.h>
#include "matroxfb_base.h" #include "matroxfb_base.h"
struct matroxfb_g450_info { #ifdef CONFIG_FB_MATROX_G450
struct matrox_fb_info* primary_dev; void matroxfb_g450_connect(WPMINFO2);
unsigned int timmings; void matroxfb_g450_shutdown(WPMINFO2);
}; #else
static inline void matroxfb_g450_connect(WPMINFO2) { };
static inline void matroxfb_g450_shutdown(WPMINFO2) { };
#endif
#endif /* __MATROXFB_MAVEN_H__ */ #endif /* __MATROXFB_G450_H__ */
This diff is collapsed.
...@@ -6,21 +6,15 @@ ...@@ -6,21 +6,15 @@
#include <linux/i2c-algo-bit.h> #include <linux/i2c-algo-bit.h>
#include "matroxfb_base.h" #include "matroxfb_base.h"
struct matroxfb_dh_maven_info;
struct i2c_bit_adapter { struct i2c_bit_adapter {
struct i2c_adapter adapter; struct i2c_adapter adapter;
int initialized; int initialized;
struct i2c_algo_bit_data bac; struct i2c_algo_bit_data bac;
struct matroxfb_dh_maven_info *minfo; struct matrox_fb_info* minfo;
}; struct {
unsigned int data;
struct matroxfb_dh_maven_info { unsigned int clock;
struct matrox_fb_info* primary_dev; } mask;
struct i2c_bit_adapter maven;
struct i2c_bit_adapter ddc1;
struct i2c_bit_adapter ddc2;
}; };
#endif /* __MATROXFB_MAVEN_H__ */ #endif /* __MATROXFB_MAVEN_H__ */
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
* *
* Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200 and G400 * Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200 and G400
* *
* (c) 1998,1999,2000,2001 Petr Vandrovec <vandrove@vc.cvut.cz> * (c) 1998-2002 Petr Vandrovec <vandrove@vc.cvut.cz>
* *
* Portions Copyright (c) 2001 Matrox Graphics Inc. * Portions Copyright (c) 2001 Matrox Graphics Inc.
* *
* Version: 1.62 2001/11/29 * Version: 1.65 2002/08/14
* *
* MTRR stuff: 1998 Tom Rini <trini@kernel.crashing.org> * MTRR stuff: 1998 Tom Rini <trini@kernel.crashing.org>
* *
...@@ -146,6 +146,7 @@ void matroxfb_var2my(struct fb_var_screeninfo* var, struct my_timming* mt) { ...@@ -146,6 +146,7 @@ void matroxfb_var2my(struct fb_var_screeninfo* var, struct my_timming* mt) {
if (!pixclock) pixclock = 10000; /* 10ns = 100MHz */ if (!pixclock) pixclock = 10000; /* 10ns = 100MHz */
mt->pixclock = 1000000000 / pixclock; mt->pixclock = 1000000000 / pixclock;
if (mt->pixclock < 1) mt->pixclock = 1; if (mt->pixclock < 1) mt->pixclock = 1;
mt->mnp = -1;
mt->dblscan = var->vmode & FB_VMODE_DOUBLE; mt->dblscan = var->vmode & FB_VMODE_DOUBLE;
mt->interlaced = var->vmode & FB_VMODE_INTERLACED; mt->interlaced = var->vmode & FB_VMODE_INTERLACED;
mt->HDisplay = var->xres; mt->HDisplay = var->xres;
...@@ -226,7 +227,7 @@ int matroxfb_vgaHWinit(WPMINFO struct my_timming* m, struct display* p) { ...@@ -226,7 +227,7 @@ int matroxfb_vgaHWinit(WPMINFO struct my_timming* m, struct display* p) {
unsigned int wd; unsigned int wd;
unsigned int divider; unsigned int divider;
int i; int i;
int text = p->type == FB_TYPE_TEXT; int text = ACCESS_FBINFO(fbcon).fix.type == FB_TYPE_TEXT;
int fwidth; int fwidth;
struct matrox_hw_state * const hw = &ACCESS_FBINFO(hw); struct matrox_hw_state * const hw = &ACCESS_FBINFO(hw);
...@@ -360,7 +361,8 @@ int matroxfb_vgaHWinit(WPMINFO struct my_timming* m, struct display* p) { ...@@ -360,7 +361,8 @@ int matroxfb_vgaHWinit(WPMINFO struct my_timming* m, struct display* p) {
((hd & 0x100) >> 7) | /* blanking */ ((hd & 0x100) >> 7) | /* blanking */
((hs & 0x100) >> 6) | /* sync start */ ((hs & 0x100) >> 6) | /* sync start */
(hbe & 0x040); /* end hor. blanking */ (hbe & 0x040); /* end hor. blanking */
if (ACCESS_FBINFO(output.ph) & MATROXFB_OUTPUT_CONN_SECONDARY) /* FIXME: Enable vidrst only on G400, and only if TV-out is used */
if (ACCESS_FBINFO(outputs[1]).src == MATROXFB_SRC_CRTC1)
hw->CRTCEXT[1] |= 0x88; /* enable horizontal and vertical vidrst */ hw->CRTCEXT[1] |= 0x88; /* enable horizontal and vertical vidrst */
hw->CRTCEXT[2] = ((vt & 0xC00) >> 10) | hw->CRTCEXT[2] = ((vt & 0xC00) >> 10) |
((vd & 0x400) >> 8) | /* disp end */ ((vd & 0x400) >> 8) | /* disp end */
...@@ -872,7 +874,7 @@ static int parse_pins5(WPMINFO const struct matrox_bios* bd) { ...@@ -872,7 +874,7 @@ static int parse_pins5(WPMINFO const struct matrox_bios* bd) {
mult = bd->pins[4]?8000:6000; mult = bd->pins[4]?8000:6000;
MINFO->limits.pixel.vcomax = (bd->pins[ 38] == 0xFF) ? 600000 : bd->pins[ 38] * mult; MINFO->limits.pixel.vcomax = (bd->pins[ 38] == 0xFF) ? 600000 : bd->pins[ 38] * mult;
MINFO->limits.system.vcomax = (bd->pins[ 36] == 0xFF) ? MINFO->limits.pixel.vcomax : bd->pins[ 39] * mult; MINFO->limits.system.vcomax = (bd->pins[ 36] == 0xFF) ? MINFO->limits.pixel.vcomax : bd->pins[ 36] * mult;
MINFO->limits.video.vcomax = (bd->pins[ 37] == 0xFF) ? MINFO->limits.system.vcomax : bd->pins[ 37] * mult; MINFO->limits.video.vcomax = (bd->pins[ 37] == 0xFF) ? MINFO->limits.system.vcomax : bd->pins[ 37] * mult;
MINFO->limits.pixel.vcomin = (bd->pins[123] == 0xFF) ? 256000 : bd->pins[123] * mult; MINFO->limits.pixel.vcomin = (bd->pins[123] == 0xFF) ? 256000 : bd->pins[123] * mult;
MINFO->limits.system.vcomin = (bd->pins[121] == 0xFF) ? MINFO->limits.pixel.vcomin : bd->pins[121] * mult; MINFO->limits.system.vcomin = (bd->pins[121] == 0xFF) ? MINFO->limits.pixel.vcomin : bd->pins[121] * mult;
...@@ -1011,6 +1013,6 @@ EXPORT_SYMBOL(matroxfb_vgaHWinit); /* DAC1064, Ti3026 */ ...@@ -1011,6 +1013,6 @@ EXPORT_SYMBOL(matroxfb_vgaHWinit); /* DAC1064, Ti3026 */
EXPORT_SYMBOL(matroxfb_vgaHWrestore); /* DAC1064, Ti3026 */ EXPORT_SYMBOL(matroxfb_vgaHWrestore); /* DAC1064, Ti3026 */
EXPORT_SYMBOL(matroxfb_read_pins); EXPORT_SYMBOL(matroxfb_read_pins);
MODULE_AUTHOR("(c) 1999-2001 Petr Vandrovec <vandrove@vc.cvut.cz>"); MODULE_AUTHOR("(c) 1999-2002 Petr Vandrovec <vandrove@vc.cvut.cz>");
MODULE_DESCRIPTION("Miscellaneous support for Matrox video cards"); MODULE_DESCRIPTION("Miscellaneous support for Matrox video cards");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment