diff options
Diffstat (limited to 'drivers/video/matrox/matroxfb_DAC1064.c')
-rw-r--r-- | drivers/video/matrox/matroxfb_DAC1064.c | 614 |
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 | ||
36 | static void DAC1064_calcclock(CPMINFO unsigned int freq, unsigned int fmax, unsigned int* in, unsigned int* feed, unsigned int* post) { | 36 | static 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 | ||
83 | static void DAC1064_setpclk(WPMINFO unsigned long fout) { | 87 | static 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 | ||
94 | static void DAC1064_setmclk(WPMINFO int oscinfo, unsigned long fmem) { | 99 | static 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 |
157 | static void g450_set_plls(WPMINFO2) { | 164 | static 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 | ||
248 | void DAC1064_global_init(WPMINFO2) { | 256 | void 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 | ||
321 | void DAC1064_global_restore(WPMINFO2) { | 330 | void 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 | ||
338 | static int DAC1064_init_1(WPMINFO struct my_timming* m) { | 348 | static 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 | ||
374 | static int DAC1064_init_2(WPMINFO struct my_timming* m) { | 385 | static 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 | ||
416 | static void DAC1064_restore_1(WPMINFO2) { | 428 | static 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 | ||
446 | static void DAC1064_restore_2(WPMINFO2) { | 459 | static 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 = { | |||
500 | static int g450_compute(void* out, struct my_timming* m) { | 514 | static 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 |
521 | static int MGA1064_init(WPMINFO struct my_timming* m) { | 535 | static 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 |
543 | static int MGAG100_init(WPMINFO struct my_timming* m) { | 558 | static 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 |
566 | static void MGA1064_ramdac_init(WPMINFO2) { | 582 | static 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??? */ | |||
589 | static int def50 = 0; /* reg50, & 0x0F, & 0x3000 (only 0x0000, 0x1000, 0x2000 (0x3000 disallowed and treated as 0) */ | 606 | static int def50 = 0; /* reg50, & 0x0F, & 0x3000 (only 0x0000, 0x1000, 0x2000 (0x3000 disallowed and treated as 0) */ |
590 | #endif | 607 | #endif |
591 | 608 | ||
592 | static void MGAG100_progPixClock(CPMINFO int flags, int m, int n, int p) { | 609 | static 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 | ||
636 | static void MGAG100_setPixClock(CPMINFO int flags, int freq) { | 655 | static 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 |
647 | static int MGA1064_preinit(WPMINFO2) { | 668 | static 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 | ||
684 | static void MGA1064_reset(WPMINFO2) { | 706 | static 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 |
693 | static void g450_mclk_init(WPMINFO2) { | 716 | static 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 | ||
721 | static void g450_memory_init(WPMINFO2) { | 745 | static 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 | ||
763 | static void g450_preinit(WPMINFO2) { | 788 | static 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 | ||
811 | static int MGAG100_preinit(WPMINFO2) { | 837 | static 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, ®50); | 907 | pci_read_config_dword(minfo->pcidev, PCI_OPTION2_REG, ®50); |
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, ®50); | 939 | pci_read_config_dword(minfo->pcidev, PCI_OPTION2_REG, ®50); |
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, ®50); | 958 | pci_read_config_dword(minfo->pcidev, PCI_OPTION2_REG, ®50); |
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 | ||
955 | static void MGAG100_reset(WPMINFO2) { | 982 | static 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 |
1012 | static void MGA1064_restore(WPMINFO2) { | 1040 | static 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 |
1038 | static void MGAG100_restore(WPMINFO2) { | 1067 | static 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 | ||