aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/matrox/matroxfb_DAC1064.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/matrox/matroxfb_DAC1064.c')
-rw-r--r--drivers/video/matrox/matroxfb_DAC1064.c614
1 files changed, 321 insertions, 293 deletions
diff --git a/drivers/video/matrox/matroxfb_DAC1064.c b/drivers/video/matrox/matroxfb_DAC1064.c
index a74e5da17aa0..f9fa0fd00292 100644
--- a/drivers/video/matrox/matroxfb_DAC1064.c
+++ b/drivers/video/matrox/matroxfb_DAC1064.c
@@ -33,7 +33,11 @@
33#define DAC1064_OPT_MDIV2 0x00 33#define DAC1064_OPT_MDIV2 0x00
34#define DAC1064_OPT_RESERVED 0x10 34#define DAC1064_OPT_RESERVED 0x10
35 35
36static void DAC1064_calcclock(CPMINFO unsigned int freq, unsigned int fmax, unsigned int* in, unsigned int* feed, unsigned int* post) { 36static void DAC1064_calcclock(const struct matrox_fb_info *minfo,
37 unsigned int freq, unsigned int fmax,
38 unsigned int *in, unsigned int *feed,
39 unsigned int *post)
40{
37 unsigned int fvco; 41 unsigned int fvco;
38 unsigned int p; 42 unsigned int p;
39 43
@@ -41,7 +45,7 @@ static void DAC1064_calcclock(CPMINFO unsigned int freq, unsigned int fmax, unsi
41 45
42 /* only for devices older than G450 */ 46 /* only for devices older than G450 */
43 47
44 fvco = PLL_calcclock(PMINFO freq, fmax, in, feed, &p); 48 fvco = PLL_calcclock(minfo, freq, fmax, in, feed, &p);
45 49
46 p = (1 << p) - 1; 50 p = (1 << p) - 1;
47 if (fvco <= 100000) 51 if (fvco <= 100000)
@@ -80,32 +84,35 @@ static const unsigned char MGA1064_DAC[] = {
80 0x00, 84 0x00,
81 0x00, 0x00, 0xFF, 0xFF}; 85 0x00, 0x00, 0xFF, 0xFF};
82 86
83static void DAC1064_setpclk(WPMINFO unsigned long fout) { 87static void DAC1064_setpclk(struct matrox_fb_info *minfo, unsigned long fout)
88{
84 unsigned int m, n, p; 89 unsigned int m, n, p;
85 90
86 DBG(__func__) 91 DBG(__func__)
87 92
88 DAC1064_calcclock(PMINFO fout, ACCESS_FBINFO(max_pixel_clock), &m, &n, &p); 93 DAC1064_calcclock(minfo, fout, minfo->max_pixel_clock, &m, &n, &p);
89 ACCESS_FBINFO(hw).DACclk[0] = m; 94 minfo->hw.DACclk[0] = m;
90 ACCESS_FBINFO(hw).DACclk[1] = n; 95 minfo->hw.DACclk[1] = n;
91 ACCESS_FBINFO(hw).DACclk[2] = p; 96 minfo->hw.DACclk[2] = p;
92} 97}
93 98
94static void DAC1064_setmclk(WPMINFO int oscinfo, unsigned long fmem) { 99static void DAC1064_setmclk(struct matrox_fb_info *minfo, int oscinfo,
100 unsigned long fmem)
101{
95 u_int32_t mx; 102 u_int32_t mx;
96 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 103 struct matrox_hw_state *hw = &minfo->hw;
97 104
98 DBG(__func__) 105 DBG(__func__)
99 106
100 if (ACCESS_FBINFO(devflags.noinit)) { 107 if (minfo->devflags.noinit) {
101 /* read MCLK and give up... */ 108 /* read MCLK and give up... */
102 hw->DACclk[3] = inDAC1064(PMINFO DAC1064_XSYSPLLM); 109 hw->DACclk[3] = inDAC1064(minfo, DAC1064_XSYSPLLM);
103 hw->DACclk[4] = inDAC1064(PMINFO DAC1064_XSYSPLLN); 110 hw->DACclk[4] = inDAC1064(minfo, DAC1064_XSYSPLLN);
104 hw->DACclk[5] = inDAC1064(PMINFO DAC1064_XSYSPLLP); 111 hw->DACclk[5] = inDAC1064(minfo, DAC1064_XSYSPLLP);
105 return; 112 return;
106 } 113 }
107 mx = hw->MXoptionReg | 0x00000004; 114 mx = hw->MXoptionReg | 0x00000004;
108 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, mx); 115 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, mx);
109 mx &= ~0x000000BB; 116 mx &= ~0x000000BB;
110 if (oscinfo & DAC1064_OPT_GDIV1) 117 if (oscinfo & DAC1064_OPT_GDIV1)
111 mx |= 0x00000008; 118 mx |= 0x00000008;
@@ -120,9 +127,9 @@ static void DAC1064_setmclk(WPMINFO int oscinfo, unsigned long fmem) {
120 127
121 /* powerup system PLL, select PCI clock */ 128 /* powerup system PLL, select PCI clock */
122 mx |= 0x00000020; 129 mx |= 0x00000020;
123 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, mx); 130 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, mx);
124 mx &= ~0x00000004; 131 mx &= ~0x00000004;
125 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, mx); 132 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, mx);
126 133
127 /* !!! you must not access device if MCLK is not running !!! 134 /* !!! you must not access device if MCLK is not running !!!
128 Doing so cause immediate PCI lockup :-( Maybe they should 135 Doing so cause immediate PCI lockup :-( Maybe they should
@@ -131,12 +138,12 @@ static void DAC1064_setmclk(WPMINFO int oscinfo, unsigned long fmem) {
131 perfect... */ 138 perfect... */
132 /* (bit 2 of PCI_OPTION_REG must be 0... and bits 0,1 must not 139 /* (bit 2 of PCI_OPTION_REG must be 0... and bits 0,1 must not
133 select PLL... because of PLL can be stopped at this time) */ 140 select PLL... because of PLL can be stopped at this time) */
134 DAC1064_calcclock(PMINFO fmem, ACCESS_FBINFO(max_pixel_clock), &m, &n, &p); 141 DAC1064_calcclock(minfo, fmem, minfo->max_pixel_clock, &m, &n, &p);
135 outDAC1064(PMINFO DAC1064_XSYSPLLM, hw->DACclk[3] = m); 142 outDAC1064(minfo, DAC1064_XSYSPLLM, hw->DACclk[3] = m);
136 outDAC1064(PMINFO DAC1064_XSYSPLLN, hw->DACclk[4] = n); 143 outDAC1064(minfo, DAC1064_XSYSPLLN, hw->DACclk[4] = n);
137 outDAC1064(PMINFO DAC1064_XSYSPLLP, hw->DACclk[5] = p); 144 outDAC1064(minfo, DAC1064_XSYSPLLP, hw->DACclk[5] = p);
138 for (clk = 65536; clk; --clk) { 145 for (clk = 65536; clk; --clk) {
139 if (inDAC1064(PMINFO DAC1064_XSYSPLLSTAT) & 0x40) 146 if (inDAC1064(minfo, DAC1064_XSYSPLLSTAT) & 0x40)
140 break; 147 break;
141 } 148 }
142 if (!clk) 149 if (!clk)
@@ -147,29 +154,30 @@ static void DAC1064_setmclk(WPMINFO int oscinfo, unsigned long fmem) {
147 /* select specified system clock source */ 154 /* select specified system clock source */
148 mx |= oscinfo & DAC1064_OPT_SCLK_MASK; 155 mx |= oscinfo & DAC1064_OPT_SCLK_MASK;
149 } 156 }
150 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, mx); 157 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, mx);
151 mx &= ~0x00000004; 158 mx &= ~0x00000004;
152 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, mx); 159 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, mx);
153 hw->MXoptionReg = mx; 160 hw->MXoptionReg = mx;
154} 161}
155 162
156#ifdef CONFIG_FB_MATROX_G 163#ifdef CONFIG_FB_MATROX_G
157static void g450_set_plls(WPMINFO2) { 164static void g450_set_plls(struct matrox_fb_info *minfo)
165{
158 u_int32_t c2_ctl; 166 u_int32_t c2_ctl;
159 unsigned int pxc; 167 unsigned int pxc;
160 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 168 struct matrox_hw_state *hw = &minfo->hw;
161 int pixelmnp; 169 int pixelmnp;
162 int videomnp; 170 int videomnp;
163 171
164 c2_ctl = hw->crtc2.ctl & ~0x4007; /* Clear PLL + enable for CRTC2 */ 172 c2_ctl = hw->crtc2.ctl & ~0x4007; /* Clear PLL + enable for CRTC2 */
165 c2_ctl |= 0x0001; /* Enable CRTC2 */ 173 c2_ctl |= 0x0001; /* Enable CRTC2 */
166 hw->DACreg[POS1064_XPWRCTRL] &= ~0x02; /* Stop VIDEO PLL */ 174 hw->DACreg[POS1064_XPWRCTRL] &= ~0x02; /* Stop VIDEO PLL */
167 pixelmnp = ACCESS_FBINFO(crtc1).mnp; 175 pixelmnp = minfo->crtc1.mnp;
168 videomnp = ACCESS_FBINFO(crtc2).mnp; 176 videomnp = minfo->crtc2.mnp;
169 if (videomnp < 0) { 177 if (videomnp < 0) {
170 c2_ctl &= ~0x0001; /* Disable CRTC2 */ 178 c2_ctl &= ~0x0001; /* Disable CRTC2 */
171 hw->DACreg[POS1064_XPWRCTRL] &= ~0x10; /* Powerdown CRTC2 */ 179 hw->DACreg[POS1064_XPWRCTRL] &= ~0x10; /* Powerdown CRTC2 */
172 } else if (ACCESS_FBINFO(crtc2).pixclock == ACCESS_FBINFO(features).pll.ref_freq) { 180 } else if (minfo->crtc2.pixclock == minfo->features.pll.ref_freq) {
173 c2_ctl |= 0x4002; /* Use reference directly */ 181 c2_ctl |= 0x4002; /* Use reference directly */
174 } else if (videomnp == pixelmnp) { 182 } else if (videomnp == pixelmnp) {
175 c2_ctl |= 0x0004; /* Use pixel PLL */ 183 c2_ctl |= 0x0004; /* Use pixel PLL */
@@ -184,27 +192,27 @@ static void g450_set_plls(WPMINFO2) {
184 c2_ctl |= 0x0006; /* Use video PLL */ 192 c2_ctl |= 0x0006; /* Use video PLL */
185 hw->DACreg[POS1064_XPWRCTRL] |= 0x02; 193 hw->DACreg[POS1064_XPWRCTRL] |= 0x02;
186 194
187 outDAC1064(PMINFO M1064_XPWRCTRL, hw->DACreg[POS1064_XPWRCTRL]); 195 outDAC1064(minfo, M1064_XPWRCTRL, hw->DACreg[POS1064_XPWRCTRL]);
188 matroxfb_g450_setpll_cond(PMINFO videomnp, M_VIDEO_PLL); 196 matroxfb_g450_setpll_cond(minfo, videomnp, M_VIDEO_PLL);
189 } 197 }
190 198
191 hw->DACreg[POS1064_XPIXCLKCTRL] &= ~M1064_XPIXCLKCTRL_PLL_UP; 199 hw->DACreg[POS1064_XPIXCLKCTRL] &= ~M1064_XPIXCLKCTRL_PLL_UP;
192 if (pixelmnp >= 0) { 200 if (pixelmnp >= 0) {
193 hw->DACreg[POS1064_XPIXCLKCTRL] |= M1064_XPIXCLKCTRL_PLL_UP; 201 hw->DACreg[POS1064_XPIXCLKCTRL] |= M1064_XPIXCLKCTRL_PLL_UP;
194 202
195 outDAC1064(PMINFO M1064_XPIXCLKCTRL, hw->DACreg[POS1064_XPIXCLKCTRL]); 203 outDAC1064(minfo, M1064_XPIXCLKCTRL, hw->DACreg[POS1064_XPIXCLKCTRL]);
196 matroxfb_g450_setpll_cond(PMINFO pixelmnp, M_PIXEL_PLL_C); 204 matroxfb_g450_setpll_cond(minfo, pixelmnp, M_PIXEL_PLL_C);
197 } 205 }
198 if (c2_ctl != hw->crtc2.ctl) { 206 if (c2_ctl != hw->crtc2.ctl) {
199 hw->crtc2.ctl = c2_ctl; 207 hw->crtc2.ctl = c2_ctl;
200 mga_outl(0x3C10, c2_ctl); 208 mga_outl(0x3C10, c2_ctl);
201 } 209 }
202 210
203 pxc = ACCESS_FBINFO(crtc1).pixclock; 211 pxc = minfo->crtc1.pixclock;
204 if (pxc == 0 || ACCESS_FBINFO(outputs[2]).src == MATROXFB_SRC_CRTC2) { 212 if (pxc == 0 || minfo->outputs[2].src == MATROXFB_SRC_CRTC2) {
205 pxc = ACCESS_FBINFO(crtc2).pixclock; 213 pxc = minfo->crtc2.pixclock;
206 } 214 }
207 if (ACCESS_FBINFO(chip) == MGA_G550) { 215 if (minfo->chip == MGA_G550) {
208 if (pxc < 45000) { 216 if (pxc < 45000) {
209 hw->DACreg[POS1064_XPANMODE] = 0x00; /* 0-50 */ 217 hw->DACreg[POS1064_XPANMODE] = 0x00; /* 0-50 */
210 } else if (pxc < 55000) { 218 } else if (pxc < 55000) {
@@ -245,18 +253,19 @@ static void g450_set_plls(WPMINFO2) {
245} 253}
246#endif 254#endif
247 255
248void DAC1064_global_init(WPMINFO2) { 256void DAC1064_global_init(struct matrox_fb_info *minfo)
249 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 257{
258 struct matrox_hw_state *hw = &minfo->hw;
250 259
251 hw->DACreg[POS1064_XMISCCTRL] &= M1064_XMISCCTRL_DAC_WIDTHMASK; 260 hw->DACreg[POS1064_XMISCCTRL] &= M1064_XMISCCTRL_DAC_WIDTHMASK;
252 hw->DACreg[POS1064_XMISCCTRL] |= M1064_XMISCCTRL_LUT_EN; 261 hw->DACreg[POS1064_XMISCCTRL] |= M1064_XMISCCTRL_LUT_EN;
253 hw->DACreg[POS1064_XPIXCLKCTRL] = M1064_XPIXCLKCTRL_PLL_UP | M1064_XPIXCLKCTRL_EN | M1064_XPIXCLKCTRL_SRC_PLL; 262 hw->DACreg[POS1064_XPIXCLKCTRL] = M1064_XPIXCLKCTRL_PLL_UP | M1064_XPIXCLKCTRL_EN | M1064_XPIXCLKCTRL_SRC_PLL;
254#ifdef CONFIG_FB_MATROX_G 263#ifdef CONFIG_FB_MATROX_G
255 if (ACCESS_FBINFO(devflags.g450dac)) { 264 if (minfo->devflags.g450dac) {
256 hw->DACreg[POS1064_XPWRCTRL] = 0x1F; /* powerup everything */ 265 hw->DACreg[POS1064_XPWRCTRL] = 0x1F; /* powerup everything */
257 hw->DACreg[POS1064_XOUTPUTCONN] = 0x00; /* disable outputs */ 266 hw->DACreg[POS1064_XOUTPUTCONN] = 0x00; /* disable outputs */
258 hw->DACreg[POS1064_XMISCCTRL] |= M1064_XMISCCTRL_DAC_EN; 267 hw->DACreg[POS1064_XMISCCTRL] |= M1064_XMISCCTRL_DAC_EN;
259 switch (ACCESS_FBINFO(outputs[0]).src) { 268 switch (minfo->outputs[0].src) {
260 case MATROXFB_SRC_CRTC1: 269 case MATROXFB_SRC_CRTC1:
261 case MATROXFB_SRC_CRTC2: 270 case MATROXFB_SRC_CRTC2:
262 hw->DACreg[POS1064_XOUTPUTCONN] |= 0x01; /* enable output; CRTC1/2 selection is in CRTC2 ctl */ 271 hw->DACreg[POS1064_XOUTPUTCONN] |= 0x01; /* enable output; CRTC1/2 selection is in CRTC2 ctl */
@@ -265,12 +274,12 @@ void DAC1064_global_init(WPMINFO2) {
265 hw->DACreg[POS1064_XMISCCTRL] &= ~M1064_XMISCCTRL_DAC_EN; 274 hw->DACreg[POS1064_XMISCCTRL] &= ~M1064_XMISCCTRL_DAC_EN;
266 break; 275 break;
267 } 276 }
268 switch (ACCESS_FBINFO(outputs[1]).src) { 277 switch (minfo->outputs[1].src) {
269 case MATROXFB_SRC_CRTC1: 278 case MATROXFB_SRC_CRTC1:
270 hw->DACreg[POS1064_XOUTPUTCONN] |= 0x04; 279 hw->DACreg[POS1064_XOUTPUTCONN] |= 0x04;
271 break; 280 break;
272 case MATROXFB_SRC_CRTC2: 281 case MATROXFB_SRC_CRTC2:
273 if (ACCESS_FBINFO(outputs[1]).mode == MATROXFB_OUTPUT_MODE_MONITOR) { 282 if (minfo->outputs[1].mode == MATROXFB_OUTPUT_MODE_MONITOR) {
274 hw->DACreg[POS1064_XOUTPUTCONN] |= 0x08; 283 hw->DACreg[POS1064_XOUTPUTCONN] |= 0x08;
275 } else { 284 } else {
276 hw->DACreg[POS1064_XOUTPUTCONN] |= 0x0C; 285 hw->DACreg[POS1064_XOUTPUTCONN] |= 0x0C;
@@ -280,7 +289,7 @@ void DAC1064_global_init(WPMINFO2) {
280 hw->DACreg[POS1064_XPWRCTRL] &= ~0x01; /* Poweroff DAC2 */ 289 hw->DACreg[POS1064_XPWRCTRL] &= ~0x01; /* Poweroff DAC2 */
281 break; 290 break;
282 } 291 }
283 switch (ACCESS_FBINFO(outputs[2]).src) { 292 switch (minfo->outputs[2].src) {
284 case MATROXFB_SRC_CRTC1: 293 case MATROXFB_SRC_CRTC1:
285 hw->DACreg[POS1064_XOUTPUTCONN] |= 0x20; 294 hw->DACreg[POS1064_XOUTPUTCONN] |= 0x20;
286 break; 295 break;
@@ -299,55 +308,57 @@ void DAC1064_global_init(WPMINFO2) {
299 break; 308 break;
300 } 309 }
301 /* Now set timming related variables... */ 310 /* Now set timming related variables... */
302 g450_set_plls(PMINFO2); 311 g450_set_plls(minfo);
303 } else 312 } else
304#endif 313#endif
305 { 314 {
306 if (ACCESS_FBINFO(outputs[1]).src == MATROXFB_SRC_CRTC1) { 315 if (minfo->outputs[1].src == MATROXFB_SRC_CRTC1) {
307 hw->DACreg[POS1064_XPIXCLKCTRL] = M1064_XPIXCLKCTRL_PLL_UP | M1064_XPIXCLKCTRL_EN | M1064_XPIXCLKCTRL_SRC_EXT; 316 hw->DACreg[POS1064_XPIXCLKCTRL] = M1064_XPIXCLKCTRL_PLL_UP | M1064_XPIXCLKCTRL_EN | M1064_XPIXCLKCTRL_SRC_EXT;
308 hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_MAFC | G400_XMISCCTRL_VDO_MAFC12; 317 hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_MAFC | G400_XMISCCTRL_VDO_MAFC12;
309 } else if (ACCESS_FBINFO(outputs[1]).src == MATROXFB_SRC_CRTC2) { 318 } else if (minfo->outputs[1].src == MATROXFB_SRC_CRTC2) {
310 hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_MAFC | G400_XMISCCTRL_VDO_C2_MAFC12; 319 hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_MAFC | G400_XMISCCTRL_VDO_C2_MAFC12;
311 } else if (ACCESS_FBINFO(outputs[2]).src == MATROXFB_SRC_CRTC1) 320 } else if (minfo->outputs[2].src == MATROXFB_SRC_CRTC1)
312 hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_PANELLINK | G400_XMISCCTRL_VDO_MAFC12; 321 hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_PANELLINK | G400_XMISCCTRL_VDO_MAFC12;
313 else 322 else
314 hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_DIS; 323 hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_DIS;
315 324
316 if (ACCESS_FBINFO(outputs[0]).src != MATROXFB_SRC_NONE) 325 if (minfo->outputs[0].src != MATROXFB_SRC_NONE)
317 hw->DACreg[POS1064_XMISCCTRL] |= M1064_XMISCCTRL_DAC_EN; 326 hw->DACreg[POS1064_XMISCCTRL] |= M1064_XMISCCTRL_DAC_EN;
318 } 327 }
319} 328}
320 329
321void DAC1064_global_restore(WPMINFO2) { 330void DAC1064_global_restore(struct matrox_fb_info *minfo)
322 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 331{
323 332 struct matrox_hw_state *hw = &minfo->hw;
324 outDAC1064(PMINFO M1064_XPIXCLKCTRL, hw->DACreg[POS1064_XPIXCLKCTRL]); 333
325 outDAC1064(PMINFO M1064_XMISCCTRL, hw->DACreg[POS1064_XMISCCTRL]); 334 outDAC1064(minfo, M1064_XPIXCLKCTRL, hw->DACreg[POS1064_XPIXCLKCTRL]);
326 if (ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG400) { 335 outDAC1064(minfo, M1064_XMISCCTRL, hw->DACreg[POS1064_XMISCCTRL]);
327 outDAC1064(PMINFO 0x20, 0x04); 336 if (minfo->devflags.accelerator == FB_ACCEL_MATROX_MGAG400) {
328 outDAC1064(PMINFO 0x1F, ACCESS_FBINFO(devflags.dfp_type)); 337 outDAC1064(minfo, 0x20, 0x04);
329 if (ACCESS_FBINFO(devflags.g450dac)) { 338 outDAC1064(minfo, 0x1F, minfo->devflags.dfp_type);
330 outDAC1064(PMINFO M1064_XSYNCCTRL, 0xCC); 339 if (minfo->devflags.g450dac) {
331 outDAC1064(PMINFO M1064_XPWRCTRL, hw->DACreg[POS1064_XPWRCTRL]); 340 outDAC1064(minfo, M1064_XSYNCCTRL, 0xCC);
332 outDAC1064(PMINFO M1064_XPANMODE, hw->DACreg[POS1064_XPANMODE]); 341 outDAC1064(minfo, M1064_XPWRCTRL, hw->DACreg[POS1064_XPWRCTRL]);
333 outDAC1064(PMINFO M1064_XOUTPUTCONN, hw->DACreg[POS1064_XOUTPUTCONN]); 342 outDAC1064(minfo, M1064_XPANMODE, hw->DACreg[POS1064_XPANMODE]);
343 outDAC1064(minfo, M1064_XOUTPUTCONN, hw->DACreg[POS1064_XOUTPUTCONN]);
334 } 344 }
335 } 345 }
336} 346}
337 347
338static int DAC1064_init_1(WPMINFO struct my_timming* m) { 348static int DAC1064_init_1(struct matrox_fb_info *minfo, struct my_timming *m)
339 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 349{
350 struct matrox_hw_state *hw = &minfo->hw;
340 351
341 DBG(__func__) 352 DBG(__func__)
342 353
343 memcpy(hw->DACreg, MGA1064_DAC, sizeof(MGA1064_DAC_regs)); 354 memcpy(hw->DACreg, MGA1064_DAC, sizeof(MGA1064_DAC_regs));
344 switch (ACCESS_FBINFO(fbcon).var.bits_per_pixel) { 355 switch (minfo->fbcon.var.bits_per_pixel) {
345 /* case 4: not supported by MGA1064 DAC */ 356 /* case 4: not supported by MGA1064 DAC */
346 case 8: 357 case 8:
347 hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_8BPP | M1064_XMULCTRL_GRAPHICS_PALETIZED; 358 hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_8BPP | M1064_XMULCTRL_GRAPHICS_PALETIZED;
348 break; 359 break;
349 case 16: 360 case 16:
350 if (ACCESS_FBINFO(fbcon).var.green.length == 5) 361 if (minfo->fbcon.var.green.length == 5)
351 hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_15BPP_1BPP | M1064_XMULCTRL_GRAPHICS_PALETIZED; 362 hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_15BPP_1BPP | M1064_XMULCTRL_GRAPHICS_PALETIZED;
352 else 363 else
353 hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_16BPP | M1064_XMULCTRL_GRAPHICS_PALETIZED; 364 hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_16BPP | M1064_XMULCTRL_GRAPHICS_PALETIZED;
@@ -361,22 +372,23 @@ static int DAC1064_init_1(WPMINFO struct my_timming* m) {
361 default: 372 default:
362 return 1; /* unsupported depth */ 373 return 1; /* unsupported depth */
363 } 374 }
364 hw->DACreg[POS1064_XVREFCTRL] = ACCESS_FBINFO(features.DAC1064.xvrefctrl); 375 hw->DACreg[POS1064_XVREFCTRL] = minfo->features.DAC1064.xvrefctrl;
365 hw->DACreg[POS1064_XGENCTRL] &= ~M1064_XGENCTRL_SYNC_ON_GREEN_MASK; 376 hw->DACreg[POS1064_XGENCTRL] &= ~M1064_XGENCTRL_SYNC_ON_GREEN_MASK;
366 hw->DACreg[POS1064_XGENCTRL] |= (m->sync & FB_SYNC_ON_GREEN)?M1064_XGENCTRL_SYNC_ON_GREEN:M1064_XGENCTRL_NO_SYNC_ON_GREEN; 377 hw->DACreg[POS1064_XGENCTRL] |= (m->sync & FB_SYNC_ON_GREEN)?M1064_XGENCTRL_SYNC_ON_GREEN:M1064_XGENCTRL_NO_SYNC_ON_GREEN;
367 hw->DACreg[POS1064_XCURADDL] = 0; 378 hw->DACreg[POS1064_XCURADDL] = 0;
368 hw->DACreg[POS1064_XCURADDH] = 0; 379 hw->DACreg[POS1064_XCURADDH] = 0;
369 380
370 DAC1064_global_init(PMINFO2); 381 DAC1064_global_init(minfo);
371 return 0; 382 return 0;
372} 383}
373 384
374static int DAC1064_init_2(WPMINFO struct my_timming* m) { 385static int DAC1064_init_2(struct matrox_fb_info *minfo, struct my_timming *m)
375 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 386{
387 struct matrox_hw_state *hw = &minfo->hw;
376 388
377 DBG(__func__) 389 DBG(__func__)
378 390
379 if (ACCESS_FBINFO(fbcon).var.bits_per_pixel > 16) { /* 256 entries */ 391 if (minfo->fbcon.var.bits_per_pixel > 16) { /* 256 entries */
380 int i; 392 int i;
381 393
382 for (i = 0; i < 256; i++) { 394 for (i = 0; i < 256; i++) {
@@ -384,8 +396,8 @@ static int DAC1064_init_2(WPMINFO struct my_timming* m) {
384 hw->DACpal[i * 3 + 1] = i; 396 hw->DACpal[i * 3 + 1] = i;
385 hw->DACpal[i * 3 + 2] = i; 397 hw->DACpal[i * 3 + 2] = i;
386 } 398 }
387 } else if (ACCESS_FBINFO(fbcon).var.bits_per_pixel > 8) { 399 } else if (minfo->fbcon.var.bits_per_pixel > 8) {
388 if (ACCESS_FBINFO(fbcon).var.green.length == 5) { /* 0..31, 128..159 */ 400 if (minfo->fbcon.var.green.length == 5) { /* 0..31, 128..159 */
389 int i; 401 int i;
390 402
391 for (i = 0; i < 32; i++) { 403 for (i = 0; i < 32; i++) {
@@ -413,8 +425,9 @@ static int DAC1064_init_2(WPMINFO struct my_timming* m) {
413 return 0; 425 return 0;
414} 426}
415 427
416static void DAC1064_restore_1(WPMINFO2) { 428static void DAC1064_restore_1(struct matrox_fb_info *minfo)
417 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 429{
430 struct matrox_hw_state *hw = &minfo->hw;
418 431
419 CRITFLAGS 432 CRITFLAGS
420 433
@@ -422,28 +435,29 @@ static void DAC1064_restore_1(WPMINFO2) {
422 435
423 CRITBEGIN 436 CRITBEGIN
424 437
425 if ((inDAC1064(PMINFO DAC1064_XSYSPLLM) != hw->DACclk[3]) || 438 if ((inDAC1064(minfo, DAC1064_XSYSPLLM) != hw->DACclk[3]) ||
426 (inDAC1064(PMINFO DAC1064_XSYSPLLN) != hw->DACclk[4]) || 439 (inDAC1064(minfo, DAC1064_XSYSPLLN) != hw->DACclk[4]) ||
427 (inDAC1064(PMINFO DAC1064_XSYSPLLP) != hw->DACclk[5])) { 440 (inDAC1064(minfo, DAC1064_XSYSPLLP) != hw->DACclk[5])) {
428 outDAC1064(PMINFO DAC1064_XSYSPLLM, hw->DACclk[3]); 441 outDAC1064(minfo, DAC1064_XSYSPLLM, hw->DACclk[3]);
429 outDAC1064(PMINFO DAC1064_XSYSPLLN, hw->DACclk[4]); 442 outDAC1064(minfo, DAC1064_XSYSPLLN, hw->DACclk[4]);
430 outDAC1064(PMINFO DAC1064_XSYSPLLP, hw->DACclk[5]); 443 outDAC1064(minfo, DAC1064_XSYSPLLP, hw->DACclk[5]);
431 } 444 }
432 { 445 {
433 unsigned int i; 446 unsigned int i;
434 447
435 for (i = 0; i < sizeof(MGA1064_DAC_regs); i++) { 448 for (i = 0; i < sizeof(MGA1064_DAC_regs); i++) {
436 if ((i != POS1064_XPIXCLKCTRL) && (i != POS1064_XMISCCTRL)) 449 if ((i != POS1064_XPIXCLKCTRL) && (i != POS1064_XMISCCTRL))
437 outDAC1064(PMINFO MGA1064_DAC_regs[i], hw->DACreg[i]); 450 outDAC1064(minfo, MGA1064_DAC_regs[i], hw->DACreg[i]);
438 } 451 }
439 } 452 }
440 453
441 DAC1064_global_restore(PMINFO2); 454 DAC1064_global_restore(minfo);
442 455
443 CRITEND 456 CRITEND
444}; 457};
445 458
446static void DAC1064_restore_2(WPMINFO2) { 459static void DAC1064_restore_2(struct matrox_fb_info *minfo)
460{
447#ifdef DEBUG 461#ifdef DEBUG
448 unsigned int i; 462 unsigned int i;
449#endif 463#endif
@@ -453,12 +467,12 @@ static void DAC1064_restore_2(WPMINFO2) {
453#ifdef DEBUG 467#ifdef DEBUG
454 dprintk(KERN_DEBUG "DAC1064regs "); 468 dprintk(KERN_DEBUG "DAC1064regs ");
455 for (i = 0; i < sizeof(MGA1064_DAC_regs); i++) { 469 for (i = 0; i < sizeof(MGA1064_DAC_regs); i++) {
456 dprintk("R%02X=%02X ", MGA1064_DAC_regs[i], ACCESS_FBINFO(hw).DACreg[i]); 470 dprintk("R%02X=%02X ", MGA1064_DAC_regs[i], minfo->hw.DACreg[i]);
457 if ((i & 0x7) == 0x7) dprintk(KERN_DEBUG "continuing... "); 471 if ((i & 0x7) == 0x7) dprintk(KERN_DEBUG "continuing... ");
458 } 472 }
459 dprintk(KERN_DEBUG "DAC1064clk "); 473 dprintk(KERN_DEBUG "DAC1064clk ");
460 for (i = 0; i < 6; i++) 474 for (i = 0; i < 6; i++)
461 dprintk("C%02X=%02X ", i, ACCESS_FBINFO(hw).DACclk[i]); 475 dprintk("C%02X=%02X ", i, minfo->hw.DACclk[i]);
462 dprintk("\n"); 476 dprintk("\n");
463#endif 477#endif
464} 478}
@@ -470,14 +484,14 @@ static int m1064_compute(void* out, struct my_timming* m) {
470 int tmout; 484 int tmout;
471 CRITFLAGS 485 CRITFLAGS
472 486
473 DAC1064_setpclk(PMINFO m->pixclock); 487 DAC1064_setpclk(minfo, m->pixclock);
474 488
475 CRITBEGIN 489 CRITBEGIN
476 490
477 for (i = 0; i < 3; i++) 491 for (i = 0; i < 3; i++)
478 outDAC1064(PMINFO M1064_XPIXPLLCM + i, ACCESS_FBINFO(hw).DACclk[i]); 492 outDAC1064(minfo, M1064_XPIXPLLCM + i, minfo->hw.DACclk[i]);
479 for (tmout = 500000; tmout; tmout--) { 493 for (tmout = 500000; tmout; tmout--) {
480 if (inDAC1064(PMINFO M1064_XPIXPLLSTAT) & 0x40) 494 if (inDAC1064(minfo, M1064_XPIXPLLSTAT) & 0x40)
481 break; 495 break;
482 udelay(10); 496 udelay(10);
483 }; 497 };
@@ -500,9 +514,9 @@ static struct matrox_altout m1064 = {
500static int g450_compute(void* out, struct my_timming* m) { 514static int g450_compute(void* out, struct my_timming* m) {
501#define minfo ((struct matrox_fb_info*)out) 515#define minfo ((struct matrox_fb_info*)out)
502 if (m->mnp < 0) { 516 if (m->mnp < 0) {
503 m->mnp = matroxfb_g450_setclk(PMINFO m->pixclock, (m->crtc == MATROXFB_SRC_CRTC1) ? M_PIXEL_PLL_C : M_VIDEO_PLL); 517 m->mnp = matroxfb_g450_setclk(minfo, m->pixclock, (m->crtc == MATROXFB_SRC_CRTC1) ? M_PIXEL_PLL_C : M_VIDEO_PLL);
504 if (m->mnp >= 0) { 518 if (m->mnp >= 0) {
505 m->pixclock = g450_mnp2f(PMINFO m->mnp); 519 m->pixclock = g450_mnp2f(minfo, m->mnp);
506 } 520 }
507 } 521 }
508#undef minfo 522#undef minfo
@@ -518,13 +532,14 @@ static struct matrox_altout g450out = {
518#endif /* NEED_DAC1064 */ 532#endif /* NEED_DAC1064 */
519 533
520#ifdef CONFIG_FB_MATROX_MYSTIQUE 534#ifdef CONFIG_FB_MATROX_MYSTIQUE
521static int MGA1064_init(WPMINFO struct my_timming* m) { 535static int MGA1064_init(struct matrox_fb_info *minfo, struct my_timming *m)
522 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 536{
537 struct matrox_hw_state *hw = &minfo->hw;
523 538
524 DBG(__func__) 539 DBG(__func__)
525 540
526 if (DAC1064_init_1(PMINFO m)) return 1; 541 if (DAC1064_init_1(minfo, m)) return 1;
527 if (matroxfb_vgaHWinit(PMINFO m)) return 1; 542 if (matroxfb_vgaHWinit(minfo, m)) return 1;
528 543
529 hw->MiscOutReg = 0xCB; 544 hw->MiscOutReg = 0xCB;
530 if (m->sync & FB_SYNC_HOR_HIGH_ACT) 545 if (m->sync & FB_SYNC_HOR_HIGH_ACT)
@@ -534,20 +549,21 @@ static int MGA1064_init(WPMINFO struct my_timming* m) {
534 if (m->sync & FB_SYNC_COMP_HIGH_ACT) /* should be only FB_SYNC_COMP */ 549 if (m->sync & FB_SYNC_COMP_HIGH_ACT) /* should be only FB_SYNC_COMP */
535 hw->CRTCEXT[3] |= 0x40; 550 hw->CRTCEXT[3] |= 0x40;
536 551
537 if (DAC1064_init_2(PMINFO m)) return 1; 552 if (DAC1064_init_2(minfo, m)) return 1;
538 return 0; 553 return 0;
539} 554}
540#endif 555#endif
541 556
542#ifdef CONFIG_FB_MATROX_G 557#ifdef CONFIG_FB_MATROX_G
543static int MGAG100_init(WPMINFO struct my_timming* m) { 558static int MGAG100_init(struct matrox_fb_info *minfo, struct my_timming *m)
544 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 559{
560 struct matrox_hw_state *hw = &minfo->hw;
545 561
546 DBG(__func__) 562 DBG(__func__)
547 563
548 if (DAC1064_init_1(PMINFO m)) return 1; 564 if (DAC1064_init_1(minfo, m)) return 1;
549 hw->MXoptionReg &= ~0x2000; 565 hw->MXoptionReg &= ~0x2000;
550 if (matroxfb_vgaHWinit(PMINFO m)) return 1; 566 if (matroxfb_vgaHWinit(minfo, m)) return 1;
551 567
552 hw->MiscOutReg = 0xEF; 568 hw->MiscOutReg = 0xEF;
553 if (m->sync & FB_SYNC_HOR_HIGH_ACT) 569 if (m->sync & FB_SYNC_HOR_HIGH_ACT)
@@ -557,27 +573,28 @@ static int MGAG100_init(WPMINFO struct my_timming* m) {
557 if (m->sync & FB_SYNC_COMP_HIGH_ACT) /* should be only FB_SYNC_COMP */ 573 if (m->sync & FB_SYNC_COMP_HIGH_ACT) /* should be only FB_SYNC_COMP */
558 hw->CRTCEXT[3] |= 0x40; 574 hw->CRTCEXT[3] |= 0x40;
559 575
560 if (DAC1064_init_2(PMINFO m)) return 1; 576 if (DAC1064_init_2(minfo, m)) return 1;
561 return 0; 577 return 0;
562} 578}
563#endif /* G */ 579#endif /* G */
564 580
565#ifdef CONFIG_FB_MATROX_MYSTIQUE 581#ifdef CONFIG_FB_MATROX_MYSTIQUE
566static void MGA1064_ramdac_init(WPMINFO2) { 582static void MGA1064_ramdac_init(struct matrox_fb_info *minfo)
583{
567 584
568 DBG(__func__) 585 DBG(__func__)
569 586
570 /* ACCESS_FBINFO(features.DAC1064.vco_freq_min) = 120000; */ 587 /* minfo->features.DAC1064.vco_freq_min = 120000; */
571 ACCESS_FBINFO(features.pll.vco_freq_min) = 62000; 588 minfo->features.pll.vco_freq_min = 62000;
572 ACCESS_FBINFO(features.pll.ref_freq) = 14318; 589 minfo->features.pll.ref_freq = 14318;
573 ACCESS_FBINFO(features.pll.feed_div_min) = 100; 590 minfo->features.pll.feed_div_min = 100;
574 ACCESS_FBINFO(features.pll.feed_div_max) = 127; 591 minfo->features.pll.feed_div_max = 127;
575 ACCESS_FBINFO(features.pll.in_div_min) = 1; 592 minfo->features.pll.in_div_min = 1;
576 ACCESS_FBINFO(features.pll.in_div_max) = 31; 593 minfo->features.pll.in_div_max = 31;
577 ACCESS_FBINFO(features.pll.post_shift_max) = 3; 594 minfo->features.pll.post_shift_max = 3;
578 ACCESS_FBINFO(features.DAC1064.xvrefctrl) = DAC1064_XVREFCTRL_EXTERNAL; 595 minfo->features.DAC1064.xvrefctrl = DAC1064_XVREFCTRL_EXTERNAL;
579 /* maybe cmdline MCLK= ?, doc says gclk=44MHz, mclk=66MHz... it was 55/83 with old values */ 596 /* maybe cmdline MCLK= ?, doc says gclk=44MHz, mclk=66MHz... it was 55/83 with old values */
580 DAC1064_setmclk(PMINFO DAC1064_OPT_MDIV2 | DAC1064_OPT_GDIV3 | DAC1064_OPT_SCLK_PLL, 133333); 597 DAC1064_setmclk(minfo, DAC1064_OPT_MDIV2 | DAC1064_OPT_GDIV3 | DAC1064_OPT_SCLK_PLL, 133333);
581} 598}
582#endif 599#endif
583 600
@@ -589,23 +606,25 @@ static int x7AF4 = 0x10; /* flags, maybe 0x10 = SDRAM, 0x00 = SGRAM??? */
589static int def50 = 0; /* reg50, & 0x0F, & 0x3000 (only 0x0000, 0x1000, 0x2000 (0x3000 disallowed and treated as 0) */ 606static int def50 = 0; /* reg50, & 0x0F, & 0x3000 (only 0x0000, 0x1000, 0x2000 (0x3000 disallowed and treated as 0) */
590#endif 607#endif
591 608
592static void MGAG100_progPixClock(CPMINFO int flags, int m, int n, int p) { 609static void MGAG100_progPixClock(const struct matrox_fb_info *minfo, int flags,
610 int m, int n, int p)
611{
593 int reg; 612 int reg;
594 int selClk; 613 int selClk;
595 int clk; 614 int clk;
596 615
597 DBG(__func__) 616 DBG(__func__)
598 617
599 outDAC1064(PMINFO M1064_XPIXCLKCTRL, inDAC1064(PMINFO M1064_XPIXCLKCTRL) | M1064_XPIXCLKCTRL_DIS | 618 outDAC1064(minfo, M1064_XPIXCLKCTRL, inDAC1064(minfo, M1064_XPIXCLKCTRL) | M1064_XPIXCLKCTRL_DIS |
600 M1064_XPIXCLKCTRL_PLL_UP); 619 M1064_XPIXCLKCTRL_PLL_UP);
601 switch (flags & 3) { 620 switch (flags & 3) {
602 case 0: reg = M1064_XPIXPLLAM; break; 621 case 0: reg = M1064_XPIXPLLAM; break;
603 case 1: reg = M1064_XPIXPLLBM; break; 622 case 1: reg = M1064_XPIXPLLBM; break;
604 default: reg = M1064_XPIXPLLCM; break; 623 default: reg = M1064_XPIXPLLCM; break;
605 } 624 }
606 outDAC1064(PMINFO reg++, m); 625 outDAC1064(minfo, reg++, m);
607 outDAC1064(PMINFO reg++, n); 626 outDAC1064(minfo, reg++, n);
608 outDAC1064(PMINFO reg, p); 627 outDAC1064(minfo, reg, p);
609 selClk = mga_inb(M_MISC_REG_READ) & ~0xC; 628 selClk = mga_inb(M_MISC_REG_READ) & ~0xC;
610 /* there should be flags & 0x03 & case 0/1/else */ 629 /* there should be flags & 0x03 & case 0/1/else */
611 /* and we should first select source and after that we should wait for PLL */ 630 /* and we should first select source and after that we should wait for PLL */
@@ -617,61 +636,64 @@ static void MGAG100_progPixClock(CPMINFO int flags, int m, int n, int p) {
617 } 636 }
618 mga_outb(M_MISC_REG, selClk); 637 mga_outb(M_MISC_REG, selClk);
619 for (clk = 500000; clk; clk--) { 638 for (clk = 500000; clk; clk--) {
620 if (inDAC1064(PMINFO M1064_XPIXPLLSTAT) & 0x40) 639 if (inDAC1064(minfo, M1064_XPIXPLLSTAT) & 0x40)
621 break; 640 break;
622 udelay(10); 641 udelay(10);
623 }; 642 };
624 if (!clk) 643 if (!clk)
625 printk(KERN_ERR "matroxfb: Pixel PLL%c not locked after usual time\n", (reg-M1064_XPIXPLLAM-2)/4 + 'A'); 644 printk(KERN_ERR "matroxfb: Pixel PLL%c not locked after usual time\n", (reg-M1064_XPIXPLLAM-2)/4 + 'A');
626 selClk = inDAC1064(PMINFO M1064_XPIXCLKCTRL) & ~M1064_XPIXCLKCTRL_SRC_MASK; 645 selClk = inDAC1064(minfo, M1064_XPIXCLKCTRL) & ~M1064_XPIXCLKCTRL_SRC_MASK;
627 switch (flags & 0x0C) { 646 switch (flags & 0x0C) {
628 case 0x00: selClk |= M1064_XPIXCLKCTRL_SRC_PCI; break; 647 case 0x00: selClk |= M1064_XPIXCLKCTRL_SRC_PCI; break;
629 case 0x04: selClk |= M1064_XPIXCLKCTRL_SRC_PLL; break; 648 case 0x04: selClk |= M1064_XPIXCLKCTRL_SRC_PLL; break;
630 default: selClk |= M1064_XPIXCLKCTRL_SRC_EXT; break; 649 default: selClk |= M1064_XPIXCLKCTRL_SRC_EXT; break;
631 } 650 }
632 outDAC1064(PMINFO M1064_XPIXCLKCTRL, selClk); 651 outDAC1064(minfo, M1064_XPIXCLKCTRL, selClk);
633 outDAC1064(PMINFO M1064_XPIXCLKCTRL, inDAC1064(PMINFO M1064_XPIXCLKCTRL) & ~M1064_XPIXCLKCTRL_DIS); 652 outDAC1064(minfo, M1064_XPIXCLKCTRL, inDAC1064(minfo, M1064_XPIXCLKCTRL) & ~M1064_XPIXCLKCTRL_DIS);
634} 653}
635 654
636static void MGAG100_setPixClock(CPMINFO int flags, int freq) { 655static void MGAG100_setPixClock(const struct matrox_fb_info *minfo, int flags,
656 int freq)
657{
637 unsigned int m, n, p; 658 unsigned int m, n, p;
638 659
639 DBG(__func__) 660 DBG(__func__)
640 661
641 DAC1064_calcclock(PMINFO freq, ACCESS_FBINFO(max_pixel_clock), &m, &n, &p); 662 DAC1064_calcclock(minfo, freq, minfo->max_pixel_clock, &m, &n, &p);
642 MGAG100_progPixClock(PMINFO flags, m, n, p); 663 MGAG100_progPixClock(minfo, flags, m, n, p);
643} 664}
644#endif 665#endif
645 666
646#ifdef CONFIG_FB_MATROX_MYSTIQUE 667#ifdef CONFIG_FB_MATROX_MYSTIQUE
647static int MGA1064_preinit(WPMINFO2) { 668static int MGA1064_preinit(struct matrox_fb_info *minfo)
669{
648 static const int vxres_mystique[] = { 512, 640, 768, 800, 832, 960, 670 static const int vxres_mystique[] = { 512, 640, 768, 800, 832, 960,
649 1024, 1152, 1280, 1600, 1664, 1920, 671 1024, 1152, 1280, 1600, 1664, 1920,
650 2048, 0}; 672 2048, 0};
651 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 673 struct matrox_hw_state *hw = &minfo->hw;
652 674
653 DBG(__func__) 675 DBG(__func__)
654 676
655 /* ACCESS_FBINFO(capable.cfb4) = 0; ... preinitialized by 0 */ 677 /* minfo->capable.cfb4 = 0; ... preinitialized by 0 */
656 ACCESS_FBINFO(capable.text) = 1; 678 minfo->capable.text = 1;
657 ACCESS_FBINFO(capable.vxres) = vxres_mystique; 679 minfo->capable.vxres = vxres_mystique;
658 680
659 ACCESS_FBINFO(outputs[0]).output = &m1064; 681 minfo->outputs[0].output = &m1064;
660 ACCESS_FBINFO(outputs[0]).src = ACCESS_FBINFO(outputs[0]).default_src; 682 minfo->outputs[0].src = minfo->outputs[0].default_src;
661 ACCESS_FBINFO(outputs[0]).data = MINFO; 683 minfo->outputs[0].data = minfo;
662 ACCESS_FBINFO(outputs[0]).mode = MATROXFB_OUTPUT_MODE_MONITOR; 684 minfo->outputs[0].mode = MATROXFB_OUTPUT_MODE_MONITOR;
663 685
664 if (ACCESS_FBINFO(devflags.noinit)) 686 if (minfo->devflags.noinit)
665 return 0; /* do not modify settings */ 687 return 0; /* do not modify settings */
666 hw->MXoptionReg &= 0xC0000100; 688 hw->MXoptionReg &= 0xC0000100;
667 hw->MXoptionReg |= 0x00094E20; 689 hw->MXoptionReg |= 0x00094E20;
668 if (ACCESS_FBINFO(devflags.novga)) 690 if (minfo->devflags.novga)
669 hw->MXoptionReg &= ~0x00000100; 691 hw->MXoptionReg &= ~0x00000100;
670 if (ACCESS_FBINFO(devflags.nobios)) 692 if (minfo->devflags.nobios)
671 hw->MXoptionReg &= ~0x40000000; 693 hw->MXoptionReg &= ~0x40000000;
672 if (ACCESS_FBINFO(devflags.nopciretry)) 694 if (minfo->devflags.nopciretry)
673 hw->MXoptionReg |= 0x20000000; 695 hw->MXoptionReg |= 0x20000000;
674 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg); 696 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, hw->MXoptionReg);
675 mga_setr(M_SEQ_INDEX, 0x01, 0x20); 697 mga_setr(M_SEQ_INDEX, 0x01, 0x20);
676 mga_outl(M_CTLWTST, 0x00000000); 698 mga_outl(M_CTLWTST, 0x00000000);
677 udelay(200); 699 udelay(200);
@@ -681,101 +703,105 @@ static int MGA1064_preinit(WPMINFO2) {
681 return 0; 703 return 0;
682} 704}
683 705
684static void MGA1064_reset(WPMINFO2) { 706static void MGA1064_reset(struct matrox_fb_info *minfo)
707{
685 708
686 DBG(__func__); 709 DBG(__func__);
687 710
688 MGA1064_ramdac_init(PMINFO2); 711 MGA1064_ramdac_init(minfo);
689} 712}
690#endif 713#endif
691 714
692#ifdef CONFIG_FB_MATROX_G 715#ifdef CONFIG_FB_MATROX_G
693static void g450_mclk_init(WPMINFO2) { 716static void g450_mclk_init(struct matrox_fb_info *minfo)
717{
694 /* switch all clocks to PCI source */ 718 /* switch all clocks to PCI source */
695 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg | 4); 719 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, minfo->hw.MXoptionReg | 4);
696 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION3_REG, ACCESS_FBINFO(values).reg.opt3 & ~0x00300C03); 720 pci_write_config_dword(minfo->pcidev, PCI_OPTION3_REG, minfo->values.reg.opt3 & ~0x00300C03);
697 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg); 721 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, minfo->hw.MXoptionReg);
698 722
699 if (((ACCESS_FBINFO(values).reg.opt3 & 0x000003) == 0x000003) || 723 if (((minfo->values.reg.opt3 & 0x000003) == 0x000003) ||
700 ((ACCESS_FBINFO(values).reg.opt3 & 0x000C00) == 0x000C00) || 724 ((minfo->values.reg.opt3 & 0x000C00) == 0x000C00) ||
701 ((ACCESS_FBINFO(values).reg.opt3 & 0x300000) == 0x300000)) { 725 ((minfo->values.reg.opt3 & 0x300000) == 0x300000)) {
702 matroxfb_g450_setclk(PMINFO ACCESS_FBINFO(values.pll.video), M_VIDEO_PLL); 726 matroxfb_g450_setclk(minfo, minfo->values.pll.video, M_VIDEO_PLL);
703 } else { 727 } else {
704 unsigned long flags; 728 unsigned long flags;
705 unsigned int pwr; 729 unsigned int pwr;
706 730
707 matroxfb_DAC_lock_irqsave(flags); 731 matroxfb_DAC_lock_irqsave(flags);
708 pwr = inDAC1064(PMINFO M1064_XPWRCTRL) & ~0x02; 732 pwr = inDAC1064(minfo, M1064_XPWRCTRL) & ~0x02;
709 outDAC1064(PMINFO M1064_XPWRCTRL, pwr); 733 outDAC1064(minfo, M1064_XPWRCTRL, pwr);
710 matroxfb_DAC_unlock_irqrestore(flags); 734 matroxfb_DAC_unlock_irqrestore(flags);
711 } 735 }
712 matroxfb_g450_setclk(PMINFO ACCESS_FBINFO(values.pll.system), M_SYSTEM_PLL); 736 matroxfb_g450_setclk(minfo, minfo->values.pll.system, M_SYSTEM_PLL);
713 737
714 /* switch clocks to their real PLL source(s) */ 738 /* switch clocks to their real PLL source(s) */
715 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg | 4); 739 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, minfo->hw.MXoptionReg | 4);
716 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION3_REG, ACCESS_FBINFO(values).reg.opt3); 740 pci_write_config_dword(minfo->pcidev, PCI_OPTION3_REG, minfo->values.reg.opt3);
717 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg); 741 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, minfo->hw.MXoptionReg);
718 742
719} 743}
720 744
721static void g450_memory_init(WPMINFO2) { 745static void g450_memory_init(struct matrox_fb_info *minfo)
746{
722 /* disable memory refresh */ 747 /* disable memory refresh */
723 ACCESS_FBINFO(hw).MXoptionReg &= ~0x001F8000; 748 minfo->hw.MXoptionReg &= ~0x001F8000;
724 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg); 749 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, minfo->hw.MXoptionReg);
725 750
726 /* set memory interface parameters */ 751 /* set memory interface parameters */
727 ACCESS_FBINFO(hw).MXoptionReg &= ~0x00207E00; 752 minfo->hw.MXoptionReg &= ~0x00207E00;
728 ACCESS_FBINFO(hw).MXoptionReg |= 0x00207E00 & ACCESS_FBINFO(values).reg.opt; 753 minfo->hw.MXoptionReg |= 0x00207E00 & minfo->values.reg.opt;
729 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg); 754 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, minfo->hw.MXoptionReg);
730 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, ACCESS_FBINFO(values).reg.opt2); 755 pci_write_config_dword(minfo->pcidev, PCI_OPTION2_REG, minfo->values.reg.opt2);
731 756
732 mga_outl(M_CTLWTST, ACCESS_FBINFO(values).reg.mctlwtst); 757 mga_outl(M_CTLWTST, minfo->values.reg.mctlwtst);
733 758
734 /* first set up memory interface with disabled memory interface clocks */ 759 /* first set up memory interface with disabled memory interface clocks */
735 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_MEMMISC_REG, ACCESS_FBINFO(values).reg.memmisc & ~0x80000000U); 760 pci_write_config_dword(minfo->pcidev, PCI_MEMMISC_REG, minfo->values.reg.memmisc & ~0x80000000U);
736 mga_outl(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk); 761 mga_outl(M_MEMRDBK, minfo->values.reg.memrdbk);
737 mga_outl(M_MACCESS, ACCESS_FBINFO(values).reg.maccess); 762 mga_outl(M_MACCESS, minfo->values.reg.maccess);
738 /* start memory clocks */ 763 /* start memory clocks */
739 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_MEMMISC_REG, ACCESS_FBINFO(values).reg.memmisc | 0x80000000U); 764 pci_write_config_dword(minfo->pcidev, PCI_MEMMISC_REG, minfo->values.reg.memmisc | 0x80000000U);
740 765
741 udelay(200); 766 udelay(200);
742 767
743 if (ACCESS_FBINFO(values).memory.ddr && (!ACCESS_FBINFO(values).memory.emrswen || !ACCESS_FBINFO(values).memory.dll)) { 768 if (minfo->values.memory.ddr && (!minfo->values.memory.emrswen || !minfo->values.memory.dll)) {
744 mga_outl(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk & ~0x1000); 769 mga_outl(M_MEMRDBK, minfo->values.reg.memrdbk & ~0x1000);
745 } 770 }
746 mga_outl(M_MACCESS, ACCESS_FBINFO(values).reg.maccess | 0x8000); 771 mga_outl(M_MACCESS, minfo->values.reg.maccess | 0x8000);
747 772
748 udelay(200); 773 udelay(200);
749 774
750 ACCESS_FBINFO(hw).MXoptionReg |= 0x001F8000 & ACCESS_FBINFO(values).reg.opt; 775 minfo->hw.MXoptionReg |= 0x001F8000 & minfo->values.reg.opt;
751 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg); 776 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, minfo->hw.MXoptionReg);
752 777
753 /* value is written to memory chips only if old != new */ 778 /* value is written to memory chips only if old != new */
754 mga_outl(M_PLNWT, 0); 779 mga_outl(M_PLNWT, 0);
755 mga_outl(M_PLNWT, ~0); 780 mga_outl(M_PLNWT, ~0);
756 781
757 if (ACCESS_FBINFO(values).reg.mctlwtst != ACCESS_FBINFO(values).reg.mctlwtst_core) { 782 if (minfo->values.reg.mctlwtst != minfo->values.reg.mctlwtst_core) {
758 mga_outl(M_CTLWTST, ACCESS_FBINFO(values).reg.mctlwtst_core); 783 mga_outl(M_CTLWTST, minfo->values.reg.mctlwtst_core);
759 } 784 }
760 785
761} 786}
762 787
763static void g450_preinit(WPMINFO2) { 788static void g450_preinit(struct matrox_fb_info *minfo)
789{
764 u_int32_t c2ctl; 790 u_int32_t c2ctl;
765 u_int8_t curctl; 791 u_int8_t curctl;
766 u_int8_t c1ctl; 792 u_int8_t c1ctl;
767 793
768 /* ACCESS_FBINFO(hw).MXoptionReg = minfo->values.reg.opt; */ 794 /* minfo->hw.MXoptionReg = minfo->values.reg.opt; */
769 ACCESS_FBINFO(hw).MXoptionReg &= 0xC0000100; 795 minfo->hw.MXoptionReg &= 0xC0000100;
770 ACCESS_FBINFO(hw).MXoptionReg |= 0x00000020; 796 minfo->hw.MXoptionReg |= 0x00000020;
771 if (ACCESS_FBINFO(devflags.novga)) 797 if (minfo->devflags.novga)
772 ACCESS_FBINFO(hw).MXoptionReg &= ~0x00000100; 798 minfo->hw.MXoptionReg &= ~0x00000100;
773 if (ACCESS_FBINFO(devflags.nobios)) 799 if (minfo->devflags.nobios)
774 ACCESS_FBINFO(hw).MXoptionReg &= ~0x40000000; 800 minfo->hw.MXoptionReg &= ~0x40000000;
775 if (ACCESS_FBINFO(devflags.nopciretry)) 801 if (minfo->devflags.nopciretry)
776 ACCESS_FBINFO(hw).MXoptionReg |= 0x20000000; 802 minfo->hw.MXoptionReg |= 0x20000000;
777 ACCESS_FBINFO(hw).MXoptionReg |= ACCESS_FBINFO(values).reg.opt & 0x03400040; 803 minfo->hw.MXoptionReg |= minfo->values.reg.opt & 0x03400040;
778 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg); 804 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, minfo->hw.MXoptionReg);
779 805
780 /* Init system clocks */ 806 /* Init system clocks */
781 807
@@ -783,24 +809,24 @@ static void g450_preinit(WPMINFO2) {
783 c2ctl = mga_inl(M_C2CTL); 809 c2ctl = mga_inl(M_C2CTL);
784 mga_outl(M_C2CTL, c2ctl & ~1); 810 mga_outl(M_C2CTL, c2ctl & ~1);
785 /* stop cursor */ 811 /* stop cursor */
786 curctl = inDAC1064(PMINFO M1064_XCURCTRL); 812 curctl = inDAC1064(minfo, M1064_XCURCTRL);
787 outDAC1064(PMINFO M1064_XCURCTRL, 0); 813 outDAC1064(minfo, M1064_XCURCTRL, 0);
788 /* stop crtc1 */ 814 /* stop crtc1 */
789 c1ctl = mga_readr(M_SEQ_INDEX, 1); 815 c1ctl = mga_readr(M_SEQ_INDEX, 1);
790 mga_setr(M_SEQ_INDEX, 1, c1ctl | 0x20); 816 mga_setr(M_SEQ_INDEX, 1, c1ctl | 0x20);
791 817
792 g450_mclk_init(PMINFO2); 818 g450_mclk_init(minfo);
793 g450_memory_init(PMINFO2); 819 g450_memory_init(minfo);
794 820
795 /* set legacy VGA clock sources for DOSEmu or VMware... */ 821 /* set legacy VGA clock sources for DOSEmu or VMware... */
796 matroxfb_g450_setclk(PMINFO 25175, M_PIXEL_PLL_A); 822 matroxfb_g450_setclk(minfo, 25175, M_PIXEL_PLL_A);
797 matroxfb_g450_setclk(PMINFO 28322, M_PIXEL_PLL_B); 823 matroxfb_g450_setclk(minfo, 28322, M_PIXEL_PLL_B);
798 824
799 /* restore crtc1 */ 825 /* restore crtc1 */
800 mga_setr(M_SEQ_INDEX, 1, c1ctl); 826 mga_setr(M_SEQ_INDEX, 1, c1ctl);
801 827
802 /* restore cursor */ 828 /* restore cursor */
803 outDAC1064(PMINFO M1064_XCURCTRL, curctl); 829 outDAC1064(minfo, M1064_XCURCTRL, curctl);
804 830
805 /* restore crtc2 */ 831 /* restore crtc2 */
806 mga_outl(M_C2CTL, c2ctl); 832 mga_outl(M_C2CTL, c2ctl);
@@ -808,11 +834,12 @@ static void g450_preinit(WPMINFO2) {
808 return; 834 return;
809} 835}
810 836
811static int MGAG100_preinit(WPMINFO2) { 837static int MGAG100_preinit(struct matrox_fb_info *minfo)
838{
812 static const int vxres_g100[] = { 512, 640, 768, 800, 832, 960, 839 static const int vxres_g100[] = { 512, 640, 768, 800, 832, 960,
813 1024, 1152, 1280, 1600, 1664, 1920, 840 1024, 1152, 1280, 1600, 1664, 1920,
814 2048, 0}; 841 2048, 0};
815 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 842 struct matrox_hw_state *hw = &minfo->hw;
816 843
817 u_int32_t reg50; 844 u_int32_t reg50;
818#if 0 845#if 0
@@ -822,68 +849,68 @@ static int MGAG100_preinit(WPMINFO2) {
822 DBG(__func__) 849 DBG(__func__)
823 850
824 /* there are some instabilities if in_div > 19 && vco < 61000 */ 851 /* there are some instabilities if in_div > 19 && vco < 61000 */
825 if (ACCESS_FBINFO(devflags.g450dac)) { 852 if (minfo->devflags.g450dac) {
826 ACCESS_FBINFO(features.pll.vco_freq_min) = 130000; /* my sample: >118 */ 853 minfo->features.pll.vco_freq_min = 130000; /* my sample: >118 */
827 } else { 854 } else {
828 ACCESS_FBINFO(features.pll.vco_freq_min) = 62000; 855 minfo->features.pll.vco_freq_min = 62000;
829 } 856 }
830 if (!ACCESS_FBINFO(features.pll.ref_freq)) { 857 if (!minfo->features.pll.ref_freq) {
831 ACCESS_FBINFO(features.pll.ref_freq) = 27000; 858 minfo->features.pll.ref_freq = 27000;
832 } 859 }
833 ACCESS_FBINFO(features.pll.feed_div_min) = 7; 860 minfo->features.pll.feed_div_min = 7;
834 ACCESS_FBINFO(features.pll.feed_div_max) = 127; 861 minfo->features.pll.feed_div_max = 127;
835 ACCESS_FBINFO(features.pll.in_div_min) = 1; 862 minfo->features.pll.in_div_min = 1;
836 ACCESS_FBINFO(features.pll.in_div_max) = 31; 863 minfo->features.pll.in_div_max = 31;
837 ACCESS_FBINFO(features.pll.post_shift_max) = 3; 864 minfo->features.pll.post_shift_max = 3;
838 ACCESS_FBINFO(features.DAC1064.xvrefctrl) = DAC1064_XVREFCTRL_G100_DEFAULT; 865 minfo->features.DAC1064.xvrefctrl = DAC1064_XVREFCTRL_G100_DEFAULT;
839 /* ACCESS_FBINFO(capable.cfb4) = 0; ... preinitialized by 0 */ 866 /* minfo->capable.cfb4 = 0; ... preinitialized by 0 */
840 ACCESS_FBINFO(capable.text) = 1; 867 minfo->capable.text = 1;
841 ACCESS_FBINFO(capable.vxres) = vxres_g100; 868 minfo->capable.vxres = vxres_g100;
842 ACCESS_FBINFO(capable.plnwt) = ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG100 869 minfo->capable.plnwt = minfo->devflags.accelerator == FB_ACCEL_MATROX_MGAG100
843 ? ACCESS_FBINFO(devflags.sgram) : 1; 870 ? minfo->devflags.sgram : 1;
844 871
845#ifdef CONFIG_FB_MATROX_G 872#ifdef CONFIG_FB_MATROX_G
846 if (ACCESS_FBINFO(devflags.g450dac)) { 873 if (minfo->devflags.g450dac) {
847 ACCESS_FBINFO(outputs[0]).output = &g450out; 874 minfo->outputs[0].output = &g450out;
848 } else 875 } else
849#endif 876#endif
850 { 877 {
851 ACCESS_FBINFO(outputs[0]).output = &m1064; 878 minfo->outputs[0].output = &m1064;
852 } 879 }
853 ACCESS_FBINFO(outputs[0]).src = ACCESS_FBINFO(outputs[0]).default_src; 880 minfo->outputs[0].src = minfo->outputs[0].default_src;
854 ACCESS_FBINFO(outputs[0]).data = MINFO; 881 minfo->outputs[0].data = minfo;
855 ACCESS_FBINFO(outputs[0]).mode = MATROXFB_OUTPUT_MODE_MONITOR; 882 minfo->outputs[0].mode = MATROXFB_OUTPUT_MODE_MONITOR;
856 883
857 if (ACCESS_FBINFO(devflags.g450dac)) { 884 if (minfo->devflags.g450dac) {
858 /* we must do this always, BIOS does not do it for us 885 /* we must do this always, BIOS does not do it for us
859 and accelerator dies without it */ 886 and accelerator dies without it */
860 mga_outl(0x1C0C, 0); 887 mga_outl(0x1C0C, 0);
861 } 888 }
862 if (ACCESS_FBINFO(devflags.noinit)) 889 if (minfo->devflags.noinit)
863 return 0; 890 return 0;
864 if (ACCESS_FBINFO(devflags.g450dac)) { 891 if (minfo->devflags.g450dac) {
865 g450_preinit(PMINFO2); 892 g450_preinit(minfo);
866 return 0; 893 return 0;
867 } 894 }
868 hw->MXoptionReg &= 0xC0000100; 895 hw->MXoptionReg &= 0xC0000100;
869 hw->MXoptionReg |= 0x00000020; 896 hw->MXoptionReg |= 0x00000020;
870 if (ACCESS_FBINFO(devflags.novga)) 897 if (minfo->devflags.novga)
871 hw->MXoptionReg &= ~0x00000100; 898 hw->MXoptionReg &= ~0x00000100;
872 if (ACCESS_FBINFO(devflags.nobios)) 899 if (minfo->devflags.nobios)
873 hw->MXoptionReg &= ~0x40000000; 900 hw->MXoptionReg &= ~0x40000000;
874 if (ACCESS_FBINFO(devflags.nopciretry)) 901 if (minfo->devflags.nopciretry)
875 hw->MXoptionReg |= 0x20000000; 902 hw->MXoptionReg |= 0x20000000;
876 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg); 903 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, hw->MXoptionReg);
877 DAC1064_setmclk(PMINFO DAC1064_OPT_MDIV2 | DAC1064_OPT_GDIV3 | DAC1064_OPT_SCLK_PCI, 133333); 904 DAC1064_setmclk(minfo, DAC1064_OPT_MDIV2 | DAC1064_OPT_GDIV3 | DAC1064_OPT_SCLK_PCI, 133333);
878 905
879 if (ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG100) { 906 if (minfo->devflags.accelerator == FB_ACCEL_MATROX_MGAG100) {
880 pci_read_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, &reg50); 907 pci_read_config_dword(minfo->pcidev, PCI_OPTION2_REG, &reg50);
881 reg50 &= ~0x3000; 908 reg50 &= ~0x3000;
882 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, reg50); 909 pci_write_config_dword(minfo->pcidev, PCI_OPTION2_REG, reg50);
883 910
884 hw->MXoptionReg |= 0x1080; 911 hw->MXoptionReg |= 0x1080;
885 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg); 912 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, hw->MXoptionReg);
886 mga_outl(M_CTLWTST, ACCESS_FBINFO(values).reg.mctlwtst); 913 mga_outl(M_CTLWTST, minfo->values.reg.mctlwtst);
887 udelay(100); 914 udelay(100);
888 mga_outb(0x1C05, 0x00); 915 mga_outb(0x1C05, 0x00);
889 mga_outb(0x1C05, 0x80); 916 mga_outb(0x1C05, 0x80);
@@ -893,68 +920,69 @@ static int MGAG100_preinit(WPMINFO2) {
893 udelay(100); 920 udelay(100);
894 reg50 &= ~0xFF; 921 reg50 &= ~0xFF;
895 reg50 |= 0x07; 922 reg50 |= 0x07;
896 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, reg50); 923 pci_write_config_dword(minfo->pcidev, PCI_OPTION2_REG, reg50);
897 /* it should help with G100 */ 924 /* it should help with G100 */
898 mga_outb(M_GRAPHICS_INDEX, 6); 925 mga_outb(M_GRAPHICS_INDEX, 6);
899 mga_outb(M_GRAPHICS_DATA, (mga_inb(M_GRAPHICS_DATA) & 3) | 4); 926 mga_outb(M_GRAPHICS_DATA, (mga_inb(M_GRAPHICS_DATA) & 3) | 4);
900 mga_setr(M_EXTVGA_INDEX, 0x03, 0x81); 927 mga_setr(M_EXTVGA_INDEX, 0x03, 0x81);
901 mga_setr(M_EXTVGA_INDEX, 0x04, 0x00); 928 mga_setr(M_EXTVGA_INDEX, 0x04, 0x00);
902 mga_writeb(ACCESS_FBINFO(video.vbase), 0x0000, 0xAA); 929 mga_writeb(minfo->video.vbase, 0x0000, 0xAA);
903 mga_writeb(ACCESS_FBINFO(video.vbase), 0x0800, 0x55); 930 mga_writeb(minfo->video.vbase, 0x0800, 0x55);
904 mga_writeb(ACCESS_FBINFO(video.vbase), 0x4000, 0x55); 931 mga_writeb(minfo->video.vbase, 0x4000, 0x55);
905#if 0 932#if 0
906 if (mga_readb(ACCESS_FBINFO(video.vbase), 0x0000) != 0xAA) { 933 if (mga_readb(minfo->video.vbase, 0x0000) != 0xAA) {
907 hw->MXoptionReg &= ~0x1000; 934 hw->MXoptionReg &= ~0x1000;
908 } 935 }
909#endif 936#endif
910 hw->MXoptionReg |= 0x00078020; 937 hw->MXoptionReg |= 0x00078020;
911 } else if (ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG200) { 938 } else if (minfo->devflags.accelerator == FB_ACCEL_MATROX_MGAG200) {
912 pci_read_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, &reg50); 939 pci_read_config_dword(minfo->pcidev, PCI_OPTION2_REG, &reg50);
913 reg50 &= ~0x3000; 940 reg50 &= ~0x3000;
914 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, reg50); 941 pci_write_config_dword(minfo->pcidev, PCI_OPTION2_REG, reg50);
915 942
916 if (ACCESS_FBINFO(devflags.memtype) == -1) 943 if (minfo->devflags.memtype == -1)
917 hw->MXoptionReg |= ACCESS_FBINFO(values).reg.opt & 0x1C00; 944 hw->MXoptionReg |= minfo->values.reg.opt & 0x1C00;
918 else 945 else
919 hw->MXoptionReg |= (ACCESS_FBINFO(devflags.memtype) & 7) << 10; 946 hw->MXoptionReg |= (minfo->devflags.memtype & 7) << 10;
920 if (ACCESS_FBINFO(devflags.sgram)) 947 if (minfo->devflags.sgram)
921 hw->MXoptionReg |= 0x4000; 948 hw->MXoptionReg |= 0x4000;
922 mga_outl(M_CTLWTST, ACCESS_FBINFO(values).reg.mctlwtst); 949 mga_outl(M_CTLWTST, minfo->values.reg.mctlwtst);
923 mga_outl(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk); 950 mga_outl(M_MEMRDBK, minfo->values.reg.memrdbk);
924 udelay(200); 951 udelay(200);
925 mga_outl(M_MACCESS, 0x00000000); 952 mga_outl(M_MACCESS, 0x00000000);
926 mga_outl(M_MACCESS, 0x00008000); 953 mga_outl(M_MACCESS, 0x00008000);
927 udelay(100); 954 udelay(100);
928 mga_outw(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk); 955 mga_outw(M_MEMRDBK, minfo->values.reg.memrdbk);
929 hw->MXoptionReg |= 0x00078020; 956 hw->MXoptionReg |= 0x00078020;
930 } else { 957 } else {
931 pci_read_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, &reg50); 958 pci_read_config_dword(minfo->pcidev, PCI_OPTION2_REG, &reg50);
932 reg50 &= ~0x00000100; 959 reg50 &= ~0x00000100;
933 reg50 |= 0x00000000; 960 reg50 |= 0x00000000;
934 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, reg50); 961 pci_write_config_dword(minfo->pcidev, PCI_OPTION2_REG, reg50);
935 962
936 if (ACCESS_FBINFO(devflags.memtype) == -1) 963 if (minfo->devflags.memtype == -1)
937 hw->MXoptionReg |= ACCESS_FBINFO(values).reg.opt & 0x1C00; 964 hw->MXoptionReg |= minfo->values.reg.opt & 0x1C00;
938 else 965 else
939 hw->MXoptionReg |= (ACCESS_FBINFO(devflags.memtype) & 7) << 10; 966 hw->MXoptionReg |= (minfo->devflags.memtype & 7) << 10;
940 if (ACCESS_FBINFO(devflags.sgram)) 967 if (minfo->devflags.sgram)
941 hw->MXoptionReg |= 0x4000; 968 hw->MXoptionReg |= 0x4000;
942 mga_outl(M_CTLWTST, ACCESS_FBINFO(values).reg.mctlwtst); 969 mga_outl(M_CTLWTST, minfo->values.reg.mctlwtst);
943 mga_outl(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk); 970 mga_outl(M_MEMRDBK, minfo->values.reg.memrdbk);
944 udelay(200); 971 udelay(200);
945 mga_outl(M_MACCESS, 0x00000000); 972 mga_outl(M_MACCESS, 0x00000000);
946 mga_outl(M_MACCESS, 0x00008000); 973 mga_outl(M_MACCESS, 0x00008000);
947 udelay(100); 974 udelay(100);
948 mga_outl(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk); 975 mga_outl(M_MEMRDBK, minfo->values.reg.memrdbk);
949 hw->MXoptionReg |= 0x00040020; 976 hw->MXoptionReg |= 0x00040020;
950 } 977 }
951 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg); 978 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, hw->MXoptionReg);
952 return 0; 979 return 0;
953} 980}
954 981
955static void MGAG100_reset(WPMINFO2) { 982static void MGAG100_reset(struct matrox_fb_info *minfo)
983{
956 u_int8_t b; 984 u_int8_t b;
957 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 985 struct matrox_hw_state *hw = &minfo->hw;
958 986
959 DBG(__func__) 987 DBG(__func__)
960 988
@@ -964,54 +992,55 @@ static void MGAG100_reset(WPMINFO2) {
964 992
965 find 1014/22 (IBM/82351); /* if found and bridging Matrox, do some strange stuff */ 993 find 1014/22 (IBM/82351); /* if found and bridging Matrox, do some strange stuff */
966 pci_read_config_byte(ibm, PCI_SECONDARY_BUS, &b); 994 pci_read_config_byte(ibm, PCI_SECONDARY_BUS, &b);
967 if (b == ACCESS_FBINFO(pcidev)->bus->number) { 995 if (b == minfo->pcidev->bus->number) {
968 pci_write_config_byte(ibm, PCI_COMMAND+1, 0); /* disable back-to-back & SERR */ 996 pci_write_config_byte(ibm, PCI_COMMAND+1, 0); /* disable back-to-back & SERR */
969 pci_write_config_byte(ibm, 0x41, 0xF4); /* ??? */ 997 pci_write_config_byte(ibm, 0x41, 0xF4); /* ??? */
970 pci_write_config_byte(ibm, PCI_IO_BASE, 0xF0); /* ??? */ 998 pci_write_config_byte(ibm, PCI_IO_BASE, 0xF0); /* ??? */
971 pci_write_config_byte(ibm, PCI_IO_LIMIT, 0x00); /* ??? */ 999 pci_write_config_byte(ibm, PCI_IO_LIMIT, 0x00); /* ??? */
972 } 1000 }
973#endif 1001#endif
974 if (!ACCESS_FBINFO(devflags.noinit)) { 1002 if (!minfo->devflags.noinit) {
975 if (x7AF4 & 8) { 1003 if (x7AF4 & 8) {
976 hw->MXoptionReg |= 0x40; /* FIXME... */ 1004 hw->MXoptionReg |= 0x40; /* FIXME... */
977 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg); 1005 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, hw->MXoptionReg);
978 } 1006 }
979 mga_setr(M_EXTVGA_INDEX, 0x06, 0x00); 1007 mga_setr(M_EXTVGA_INDEX, 0x06, 0x00);
980 } 1008 }
981 } 1009 }
982 if (ACCESS_FBINFO(devflags.g450dac)) { 1010 if (minfo->devflags.g450dac) {
983 /* either leave MCLK as is... or they were set in preinit */ 1011 /* either leave MCLK as is... or they were set in preinit */
984 hw->DACclk[3] = inDAC1064(PMINFO DAC1064_XSYSPLLM); 1012 hw->DACclk[3] = inDAC1064(minfo, DAC1064_XSYSPLLM);
985 hw->DACclk[4] = inDAC1064(PMINFO DAC1064_XSYSPLLN); 1013 hw->DACclk[4] = inDAC1064(minfo, DAC1064_XSYSPLLN);
986 hw->DACclk[5] = inDAC1064(PMINFO DAC1064_XSYSPLLP); 1014 hw->DACclk[5] = inDAC1064(minfo, DAC1064_XSYSPLLP);
987 } else { 1015 } else {
988 DAC1064_setmclk(PMINFO DAC1064_OPT_RESERVED | DAC1064_OPT_MDIV2 | DAC1064_OPT_GDIV1 | DAC1064_OPT_SCLK_PLL, 133333); 1016 DAC1064_setmclk(minfo, DAC1064_OPT_RESERVED | DAC1064_OPT_MDIV2 | DAC1064_OPT_GDIV1 | DAC1064_OPT_SCLK_PLL, 133333);
989 } 1017 }
990 if (ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG400) { 1018 if (minfo->devflags.accelerator == FB_ACCEL_MATROX_MGAG400) {
991 if (ACCESS_FBINFO(devflags.dfp_type) == -1) { 1019 if (minfo->devflags.dfp_type == -1) {
992 ACCESS_FBINFO(devflags.dfp_type) = inDAC1064(PMINFO 0x1F); 1020 minfo->devflags.dfp_type = inDAC1064(minfo, 0x1F);
993 } 1021 }
994 } 1022 }
995 if (ACCESS_FBINFO(devflags.noinit)) 1023 if (minfo->devflags.noinit)
996 return; 1024 return;
997 if (ACCESS_FBINFO(devflags.g450dac)) { 1025 if (minfo->devflags.g450dac) {
998 } else { 1026 } else {
999 MGAG100_setPixClock(PMINFO 4, 25175); 1027 MGAG100_setPixClock(minfo, 4, 25175);
1000 MGAG100_setPixClock(PMINFO 5, 28322); 1028 MGAG100_setPixClock(minfo, 5, 28322);
1001 if (x7AF4 & 0x10) { 1029 if (x7AF4 & 0x10) {
1002 b = inDAC1064(PMINFO M1064_XGENIODATA) & ~1; 1030 b = inDAC1064(minfo, M1064_XGENIODATA) & ~1;
1003 outDAC1064(PMINFO M1064_XGENIODATA, b); 1031 outDAC1064(minfo, M1064_XGENIODATA, b);
1004 b = inDAC1064(PMINFO M1064_XGENIOCTRL) | 1; 1032 b = inDAC1064(minfo, M1064_XGENIOCTRL) | 1;
1005 outDAC1064(PMINFO M1064_XGENIOCTRL, b); 1033 outDAC1064(minfo, M1064_XGENIOCTRL, b);
1006 } 1034 }
1007 } 1035 }
1008} 1036}
1009#endif 1037#endif
1010 1038
1011#ifdef CONFIG_FB_MATROX_MYSTIQUE 1039#ifdef CONFIG_FB_MATROX_MYSTIQUE
1012static void MGA1064_restore(WPMINFO2) { 1040static void MGA1064_restore(struct matrox_fb_info *minfo)
1041{
1013 int i; 1042 int i;
1014 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 1043 struct matrox_hw_state *hw = &minfo->hw;
1015 1044
1016 CRITFLAGS 1045 CRITFLAGS
1017 1046
@@ -1019,25 +1048,26 @@ static void MGA1064_restore(WPMINFO2) {
1019 1048
1020 CRITBEGIN 1049 CRITBEGIN
1021 1050
1022 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg); 1051 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, hw->MXoptionReg);
1023 mga_outb(M_IEN, 0x00); 1052 mga_outb(M_IEN, 0x00);
1024 mga_outb(M_CACHEFLUSH, 0x00); 1053 mga_outb(M_CACHEFLUSH, 0x00);
1025 1054
1026 CRITEND 1055 CRITEND
1027 1056
1028 DAC1064_restore_1(PMINFO2); 1057 DAC1064_restore_1(minfo);
1029 matroxfb_vgaHWrestore(PMINFO2); 1058 matroxfb_vgaHWrestore(minfo);
1030 ACCESS_FBINFO(crtc1.panpos) = -1; 1059 minfo->crtc1.panpos = -1;
1031 for (i = 0; i < 6; i++) 1060 for (i = 0; i < 6; i++)
1032 mga_setr(M_EXTVGA_INDEX, i, hw->CRTCEXT[i]); 1061 mga_setr(M_EXTVGA_INDEX, i, hw->CRTCEXT[i]);
1033 DAC1064_restore_2(PMINFO2); 1062 DAC1064_restore_2(minfo);
1034} 1063}
1035#endif 1064#endif
1036 1065
1037#ifdef CONFIG_FB_MATROX_G 1066#ifdef CONFIG_FB_MATROX_G
1038static void MGAG100_restore(WPMINFO2) { 1067static void MGAG100_restore(struct matrox_fb_info *minfo)
1068{
1039 int i; 1069 int i;
1040 struct matrox_hw_state* hw = &ACCESS_FBINFO(hw); 1070 struct matrox_hw_state *hw = &minfo->hw;
1041 1071
1042 CRITFLAGS 1072 CRITFLAGS
1043 1073
@@ -1045,19 +1075,17 @@ static void MGAG100_restore(WPMINFO2) {
1045 1075
1046 CRITBEGIN 1076 CRITBEGIN
1047 1077
1048 pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg); 1078 pci_write_config_dword(minfo->pcidev, PCI_OPTION_REG, hw->MXoptionReg);
1049 CRITEND 1079 CRITEND
1050 1080
1051 DAC1064_restore_1(PMINFO2); 1081 DAC1064_restore_1(minfo);
1052 matroxfb_vgaHWrestore(PMINFO2); 1082 matroxfb_vgaHWrestore(minfo);
1053#ifdef CONFIG_FB_MATROX_32MB 1083 if (minfo->devflags.support32MB)
1054 if (ACCESS_FBINFO(devflags.support32MB))
1055 mga_setr(M_EXTVGA_INDEX, 8, hw->CRTCEXT[8]); 1084 mga_setr(M_EXTVGA_INDEX, 8, hw->CRTCEXT[8]);
1056#endif 1085 minfo->crtc1.panpos = -1;
1057 ACCESS_FBINFO(crtc1.panpos) = -1;
1058 for (i = 0; i < 6; i++) 1086 for (i = 0; i < 6; i++)
1059 mga_setr(M_EXTVGA_INDEX, i, hw->CRTCEXT[i]); 1087 mga_setr(M_EXTVGA_INDEX, i, hw->CRTCEXT[i]);
1060 DAC1064_restore_2(PMINFO2); 1088 DAC1064_restore_2(minfo);
1061} 1089}
1062#endif 1090#endif
1063 1091