diff options
-rw-r--r-- | drivers/video/neofb.c | 88 | ||||
-rw-r--r-- | include/video/neomagic.h | 17 |
2 files changed, 40 insertions, 65 deletions
diff --git a/drivers/video/neofb.c b/drivers/video/neofb.c index 669b8c196bba..25172b2a2a94 100644 --- a/drivers/video/neofb.c +++ b/drivers/video/neofb.c | |||
@@ -259,15 +259,20 @@ static void neoCalcVCLK(const struct fb_info *info, | |||
259 | */ | 259 | */ |
260 | 260 | ||
261 | static int vgaHWInit(const struct fb_var_screeninfo *var, | 261 | static int vgaHWInit(const struct fb_var_screeninfo *var, |
262 | const struct fb_info *info, | 262 | struct neofb_par *par) |
263 | struct neofb_par *par, struct xtimings *timings) | ||
264 | { | 263 | { |
264 | int hsync_end = var->xres + var->right_margin + var->hsync_len; | ||
265 | int htotal = (hsync_end + var->left_margin) >> 3; | ||
266 | int vsync_start = var->yres + var->lower_margin; | ||
267 | int vsync_end = vsync_start + var->vsync_len; | ||
268 | int vtotal = vsync_end + var->upper_margin; | ||
269 | |||
265 | par->MiscOutReg = 0x23; | 270 | par->MiscOutReg = 0x23; |
266 | 271 | ||
267 | if (!(timings->sync & FB_SYNC_HOR_HIGH_ACT)) | 272 | if (!(var->sync & FB_SYNC_HOR_HIGH_ACT)) |
268 | par->MiscOutReg |= 0x40; | 273 | par->MiscOutReg |= 0x40; |
269 | 274 | ||
270 | if (!(timings->sync & FB_SYNC_VERT_HIGH_ACT)) | 275 | if (!(var->sync & FB_SYNC_VERT_HIGH_ACT)) |
271 | par->MiscOutReg |= 0x80; | 276 | par->MiscOutReg |= 0x80; |
272 | 277 | ||
273 | /* | 278 | /* |
@@ -282,25 +287,25 @@ static int vgaHWInit(const struct fb_var_screeninfo *var, | |||
282 | /* | 287 | /* |
283 | * CRTC Controller | 288 | * CRTC Controller |
284 | */ | 289 | */ |
285 | par->CRTC[0] = (timings->HTotal >> 3) - 5; | 290 | par->CRTC[0] = htotal - 5; |
286 | par->CRTC[1] = (timings->HDisplay >> 3) - 1; | 291 | par->CRTC[1] = (var->xres >> 3) - 1; |
287 | par->CRTC[2] = (timings->HDisplay >> 3) - 1; | 292 | par->CRTC[2] = (var->xres >> 3) - 1; |
288 | par->CRTC[3] = (((timings->HTotal >> 3) - 1) & 0x1F) | 0x80; | 293 | par->CRTC[3] = ((htotal - 1) & 0x1F) | 0x80; |
289 | par->CRTC[4] = (timings->HSyncStart >> 3); | 294 | par->CRTC[4] = ((var->xres + var->right_margin) >> 3); |
290 | par->CRTC[5] = ((((timings->HTotal >> 3) - 1) & 0x20) << 2) | 295 | par->CRTC[5] = (((htotal - 1) & 0x20) << 2) |
291 | | (((timings->HSyncEnd >> 3)) & 0x1F); | 296 | | (((hsync_end >> 3)) & 0x1F); |
292 | par->CRTC[6] = (timings->VTotal - 2) & 0xFF; | 297 | par->CRTC[6] = (vtotal - 2) & 0xFF; |
293 | par->CRTC[7] = (((timings->VTotal - 2) & 0x100) >> 8) | 298 | par->CRTC[7] = (((vtotal - 2) & 0x100) >> 8) |
294 | | (((timings->VDisplay - 1) & 0x100) >> 7) | 299 | | (((var->yres - 1) & 0x100) >> 7) |
295 | | ((timings->VSyncStart & 0x100) >> 6) | 300 | | ((vsync_start & 0x100) >> 6) |
296 | | (((timings->VDisplay - 1) & 0x100) >> 5) | 301 | | (((var->yres - 1) & 0x100) >> 5) |
297 | | 0x10 | (((timings->VTotal - 2) & 0x200) >> 4) | 302 | | 0x10 | (((vtotal - 2) & 0x200) >> 4) |
298 | | (((timings->VDisplay - 1) & 0x200) >> 3) | 303 | | (((var->yres - 1) & 0x200) >> 3) |
299 | | ((timings->VSyncStart & 0x200) >> 2); | 304 | | ((vsync_start & 0x200) >> 2); |
300 | par->CRTC[8] = 0x00; | 305 | par->CRTC[8] = 0x00; |
301 | par->CRTC[9] = (((timings->VDisplay - 1) & 0x200) >> 4) | 0x40; | 306 | par->CRTC[9] = (((var->yres - 1) & 0x200) >> 4) | 0x40; |
302 | 307 | ||
303 | if (timings->dblscan) | 308 | if (var->vmode & FB_VMODE_DOUBLE) |
304 | par->CRTC[9] |= 0x80; | 309 | par->CRTC[9] |= 0x80; |
305 | 310 | ||
306 | par->CRTC[10] = 0x00; | 311 | par->CRTC[10] = 0x00; |
@@ -309,13 +314,13 @@ static int vgaHWInit(const struct fb_var_screeninfo *var, | |||
309 | par->CRTC[13] = 0x00; | 314 | par->CRTC[13] = 0x00; |
310 | par->CRTC[14] = 0x00; | 315 | par->CRTC[14] = 0x00; |
311 | par->CRTC[15] = 0x00; | 316 | par->CRTC[15] = 0x00; |
312 | par->CRTC[16] = timings->VSyncStart & 0xFF; | 317 | par->CRTC[16] = vsync_start & 0xFF; |
313 | par->CRTC[17] = (timings->VSyncEnd & 0x0F) | 0x20; | 318 | par->CRTC[17] = (vsync_end & 0x0F) | 0x20; |
314 | par->CRTC[18] = (timings->VDisplay - 1) & 0xFF; | 319 | par->CRTC[18] = (var->yres - 1) & 0xFF; |
315 | par->CRTC[19] = var->xres_virtual >> 4; | 320 | par->CRTC[19] = var->xres_virtual >> 4; |
316 | par->CRTC[20] = 0x00; | 321 | par->CRTC[20] = 0x00; |
317 | par->CRTC[21] = (timings->VDisplay - 1) & 0xFF; | 322 | par->CRTC[21] = (var->yres - 1) & 0xFF; |
318 | par->CRTC[22] = (timings->VTotal - 1) & 0xFF; | 323 | par->CRTC[22] = (vtotal - 1) & 0xFF; |
319 | par->CRTC[23] = 0xC3; | 324 | par->CRTC[23] = 0xC3; |
320 | par->CRTC[24] = 0xFF; | 325 | par->CRTC[24] = 0xFF; |
321 | 326 | ||
@@ -736,11 +741,11 @@ neofb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |||
736 | static int neofb_set_par(struct fb_info *info) | 741 | static int neofb_set_par(struct fb_info *info) |
737 | { | 742 | { |
738 | struct neofb_par *par = info->par; | 743 | struct neofb_par *par = info->par; |
739 | struct xtimings timings; | ||
740 | unsigned char temp; | 744 | unsigned char temp; |
741 | int i, clock_hi = 0; | 745 | int i, clock_hi = 0; |
742 | int lcd_stretch; | 746 | int lcd_stretch; |
743 | int hoffset, voffset; | 747 | int hoffset, voffset; |
748 | int vsync_start, vtotal; | ||
744 | 749 | ||
745 | DBG("neofb_set_par"); | 750 | DBG("neofb_set_par"); |
746 | 751 | ||
@@ -748,28 +753,15 @@ static int neofb_set_par(struct fb_info *info) | |||
748 | 753 | ||
749 | vgaHWProtect(1); /* Blank the screen */ | 754 | vgaHWProtect(1); /* Blank the screen */ |
750 | 755 | ||
751 | timings.dblscan = info->var.vmode & FB_VMODE_DOUBLE; | 756 | vsync_start = info->var.yres + info->var.lower_margin; |
752 | timings.interlaced = info->var.vmode & FB_VMODE_INTERLACED; | 757 | vtotal = vsync_start + info->var.vsync_len + info->var.upper_margin; |
753 | timings.HDisplay = info->var.xres; | ||
754 | timings.HSyncStart = timings.HDisplay + info->var.right_margin; | ||
755 | timings.HSyncEnd = timings.HSyncStart + info->var.hsync_len; | ||
756 | timings.HTotal = timings.HSyncEnd + info->var.left_margin; | ||
757 | timings.VDisplay = info->var.yres; | ||
758 | timings.VSyncStart = timings.VDisplay + info->var.lower_margin; | ||
759 | timings.VSyncEnd = timings.VSyncStart + info->var.vsync_len; | ||
760 | timings.VTotal = timings.VSyncEnd + info->var.upper_margin; | ||
761 | timings.sync = info->var.sync; | ||
762 | timings.pixclock = PICOS2KHZ(info->var.pixclock); | ||
763 | |||
764 | if (timings.pixclock < 1) | ||
765 | timings.pixclock = 1; | ||
766 | 758 | ||
767 | /* | 759 | /* |
768 | * This will allocate the datastructure and initialize all of the | 760 | * This will allocate the datastructure and initialize all of the |
769 | * generic VGA registers. | 761 | * generic VGA registers. |
770 | */ | 762 | */ |
771 | 763 | ||
772 | if (vgaHWInit(&info->var, info, par, &timings)) | 764 | if (vgaHWInit(&info->var, par)) |
773 | return -EINVAL; | 765 | return -EINVAL; |
774 | 766 | ||
775 | /* | 767 | /* |
@@ -808,10 +800,10 @@ static int neofb_set_par(struct fb_info *info) | |||
808 | par->ExtCRTDispAddr = 0x10; | 800 | par->ExtCRTDispAddr = 0x10; |
809 | 801 | ||
810 | /* Vertical Extension */ | 802 | /* Vertical Extension */ |
811 | par->VerticalExt = (((timings.VTotal - 2) & 0x400) >> 10) | 803 | par->VerticalExt = (((vtotal - 2) & 0x400) >> 10) |
812 | | (((timings.VDisplay - 1) & 0x400) >> 9) | 804 | | (((info->var.yres - 1) & 0x400) >> 9) |
813 | | (((timings.VSyncStart) & 0x400) >> 8) | 805 | | (((vsync_start) & 0x400) >> 8) |
814 | | (((timings.VSyncStart) & 0x400) >> 7); | 806 | | (((vsync_start) & 0x400) >> 7); |
815 | 807 | ||
816 | /* Fast write bursts on unless disabled. */ | 808 | /* Fast write bursts on unless disabled. */ |
817 | if (par->pci_burst) | 809 | if (par->pci_burst) |
@@ -972,7 +964,7 @@ static int neofb_set_par(struct fb_info *info) | |||
972 | * Calculate the VCLK that most closely matches the requested dot | 964 | * Calculate the VCLK that most closely matches the requested dot |
973 | * clock. | 965 | * clock. |
974 | */ | 966 | */ |
975 | neoCalcVCLK(info, par, timings.pixclock); | 967 | neoCalcVCLK(info, par, PICOS2KHZ(info->var.pixclock)); |
976 | 968 | ||
977 | /* Since we program the clocks ourselves, always use VCLK3. */ | 969 | /* Since we program the clocks ourselves, always use VCLK3. */ |
978 | par->MiscOutReg |= 0x0C; | 970 | par->MiscOutReg |= 0x0C; |
diff --git a/include/video/neomagic.h b/include/video/neomagic.h index a9e118a1cd16..38910da0ae59 100644 --- a/include/video/neomagic.h +++ b/include/video/neomagic.h | |||
@@ -90,23 +90,6 @@ | |||
90 | #define PCI_CHIP_NM2360 0x0006 | 90 | #define PCI_CHIP_NM2360 0x0006 |
91 | #define PCI_CHIP_NM2380 0x0016 | 91 | #define PCI_CHIP_NM2380 0x0016 |
92 | 92 | ||
93 | |||
94 | struct xtimings { | ||
95 | unsigned int pixclock; | ||
96 | unsigned int HDisplay; | ||
97 | unsigned int HSyncStart; | ||
98 | unsigned int HSyncEnd; | ||
99 | unsigned int HTotal; | ||
100 | unsigned int VDisplay; | ||
101 | unsigned int VSyncStart; | ||
102 | unsigned int VSyncEnd; | ||
103 | unsigned int VTotal; | ||
104 | unsigned int sync; | ||
105 | int dblscan; | ||
106 | int interlaced; | ||
107 | }; | ||
108 | |||
109 | |||
110 | /* --------------------------------------------------------------------- */ | 93 | /* --------------------------------------------------------------------- */ |
111 | 94 | ||
112 | typedef volatile struct { | 95 | typedef volatile struct { |