diff options
| -rw-r--r-- | drivers/video/cyber2000fb.c | 208 |
1 files changed, 105 insertions, 103 deletions
diff --git a/drivers/video/cyber2000fb.c b/drivers/video/cyber2000fb.c index 5e3edf475bf4..5fb8675e0d6b 100644 --- a/drivers/video/cyber2000fb.c +++ b/drivers/video/cyber2000fb.c | |||
| @@ -62,7 +62,7 @@ struct cfb_info { | |||
| 62 | struct display_switch *dispsw; | 62 | struct display_switch *dispsw; |
| 63 | struct display *display; | 63 | struct display *display; |
| 64 | struct pci_dev *dev; | 64 | struct pci_dev *dev; |
| 65 | unsigned char __iomem *region; | 65 | unsigned char __iomem *region; |
| 66 | unsigned char __iomem *regs; | 66 | unsigned char __iomem *regs; |
| 67 | u_int id; | 67 | u_int id; |
| 68 | int func_use_count; | 68 | int func_use_count; |
| @@ -97,11 +97,11 @@ MODULE_PARM_DESC(default_font, "Default font name"); | |||
| 97 | /* | 97 | /* |
| 98 | * Our access methods. | 98 | * Our access methods. |
| 99 | */ | 99 | */ |
| 100 | #define cyber2000fb_writel(val,reg,cfb) writel(val, (cfb)->regs + (reg)) | 100 | #define cyber2000fb_writel(val, reg, cfb) writel(val, (cfb)->regs + (reg)) |
| 101 | #define cyber2000fb_writew(val,reg,cfb) writew(val, (cfb)->regs + (reg)) | 101 | #define cyber2000fb_writew(val, reg, cfb) writew(val, (cfb)->regs + (reg)) |
| 102 | #define cyber2000fb_writeb(val,reg,cfb) writeb(val, (cfb)->regs + (reg)) | 102 | #define cyber2000fb_writeb(val, reg, cfb) writeb(val, (cfb)->regs + (reg)) |
| 103 | 103 | ||
| 104 | #define cyber2000fb_readb(reg,cfb) readb((cfb)->regs + (reg)) | 104 | #define cyber2000fb_readb(reg, cfb) readb((cfb)->regs + (reg)) |
| 105 | 105 | ||
| 106 | static inline void | 106 | static inline void |
| 107 | cyber2000_crtcw(unsigned int reg, unsigned int val, struct cfb_info *cfb) | 107 | cyber2000_crtcw(unsigned int reg, unsigned int val, struct cfb_info *cfb) |
| @@ -221,12 +221,8 @@ cyber2000fb_copyarea(struct fb_info *info, const struct fb_copyarea *region) | |||
| 221 | static void | 221 | static void |
| 222 | cyber2000fb_imageblit(struct fb_info *info, const struct fb_image *image) | 222 | cyber2000fb_imageblit(struct fb_info *info, const struct fb_image *image) |
| 223 | { | 223 | { |
| 224 | // struct cfb_info *cfb = (struct cfb_info *)info; | 224 | cfb_imageblit(info, image); |
| 225 | 225 | return; | |
| 226 | // if (!(cfb->fb.var.accel_flags & FB_ACCELF_TEXT)) { | ||
| 227 | cfb_imageblit(info, image); | ||
| 228 | return; | ||
| 229 | // } | ||
| 230 | } | 226 | } |
| 231 | 227 | ||
| 232 | static int cyber2000fb_sync(struct fb_info *info) | 228 | static int cyber2000fb_sync(struct fb_info *info) |
| @@ -277,12 +273,12 @@ cyber2000fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
| 277 | 273 | ||
| 278 | /* | 274 | /* |
| 279 | * Pseudocolour: | 275 | * Pseudocolour: |
| 280 | * 8 8 | 276 | * 8 8 |
| 281 | * pixel --/--+--/--> red lut --> red dac | 277 | * pixel --/--+--/--> red lut --> red dac |
| 282 | * | 8 | 278 | * | 8 |
| 283 | * +--/--> green lut --> green dac | 279 | * +--/--> green lut --> green dac |
| 284 | * | 8 | 280 | * | 8 |
| 285 | * +--/--> blue lut --> blue dac | 281 | * +--/--> blue lut --> blue dac |
| 286 | */ | 282 | */ |
| 287 | case FB_VISUAL_PSEUDOCOLOR: | 283 | case FB_VISUAL_PSEUDOCOLOR: |
| 288 | if (regno >= NR_PALETTE) | 284 | if (regno >= NR_PALETTE) |
| @@ -292,9 +288,9 @@ cyber2000fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
| 292 | green >>= 8; | 288 | green >>= 8; |
| 293 | blue >>= 8; | 289 | blue >>= 8; |
| 294 | 290 | ||
| 295 | cfb->palette[regno].red = red; | 291 | cfb->palette[regno].red = red; |
| 296 | cfb->palette[regno].green = green; | 292 | cfb->palette[regno].green = green; |
| 297 | cfb->palette[regno].blue = blue; | 293 | cfb->palette[regno].blue = blue; |
| 298 | 294 | ||
| 299 | cyber2000fb_writeb(regno, 0x3c8, cfb); | 295 | cyber2000fb_writeb(regno, 0x3c8, cfb); |
| 300 | cyber2000fb_writeb(red, 0x3c9, cfb); | 296 | cyber2000fb_writeb(red, 0x3c9, cfb); |
| @@ -304,12 +300,12 @@ cyber2000fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
| 304 | 300 | ||
| 305 | /* | 301 | /* |
| 306 | * Direct colour: | 302 | * Direct colour: |
| 307 | * n rl | 303 | * n rl |
| 308 | * pixel --/--+--/--> red lut --> red dac | 304 | * pixel --/--+--/--> red lut --> red dac |
| 309 | * | gl | 305 | * | gl |
| 310 | * +--/--> green lut --> green dac | 306 | * +--/--> green lut --> green dac |
| 311 | * | bl | 307 | * | bl |
| 312 | * +--/--> blue lut --> blue dac | 308 | * +--/--> blue lut --> blue dac |
| 313 | * n = bpp, rl = red length, gl = green length, bl = blue length | 309 | * n = bpp, rl = red length, gl = green length, bl = blue length |
| 314 | */ | 310 | */ |
| 315 | case FB_VISUAL_DIRECTCOLOR: | 311 | case FB_VISUAL_DIRECTCOLOR: |
| @@ -325,9 +321,11 @@ cyber2000fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
| 325 | * to the high 6 bits of the LUT. | 321 | * to the high 6 bits of the LUT. |
| 326 | */ | 322 | */ |
| 327 | cyber2000fb_writeb(regno << 2, 0x3c8, cfb); | 323 | cyber2000fb_writeb(regno << 2, 0x3c8, cfb); |
| 328 | cyber2000fb_writeb(cfb->palette[regno >> 1].red, 0x3c9, cfb); | 324 | cyber2000fb_writeb(cfb->palette[regno >> 1].red, |
| 325 | 0x3c9, cfb); | ||
| 329 | cyber2000fb_writeb(green, 0x3c9, cfb); | 326 | cyber2000fb_writeb(green, 0x3c9, cfb); |
| 330 | cyber2000fb_writeb(cfb->palette[regno >> 1].blue, 0x3c9, cfb); | 327 | cyber2000fb_writeb(cfb->palette[regno >> 1].blue, |
| 328 | 0x3c9, cfb); | ||
| 331 | 329 | ||
| 332 | green = cfb->palette[regno << 3].green; | 330 | green = cfb->palette[regno << 3].green; |
| 333 | 331 | ||
| @@ -335,9 +333,9 @@ cyber2000fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
| 335 | } | 333 | } |
| 336 | 334 | ||
| 337 | if (var->green.length >= 5 && regno < 32) { | 335 | if (var->green.length >= 5 && regno < 32) { |
| 338 | cfb->palette[regno << 3].red = red; | 336 | cfb->palette[regno << 3].red = red; |
| 339 | cfb->palette[regno << 3].green = green; | 337 | cfb->palette[regno << 3].green = green; |
| 340 | cfb->palette[regno << 3].blue = blue; | 338 | cfb->palette[regno << 3].blue = blue; |
| 341 | 339 | ||
| 342 | /* | 340 | /* |
| 343 | * The 5 bits of each colour component are | 341 | * The 5 bits of each colour component are |
| @@ -351,9 +349,9 @@ cyber2000fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
| 351 | } | 349 | } |
| 352 | 350 | ||
| 353 | if (var->green.length == 4 && regno < 16) { | 351 | if (var->green.length == 4 && regno < 16) { |
| 354 | cfb->palette[regno << 4].red = red; | 352 | cfb->palette[regno << 4].red = red; |
| 355 | cfb->palette[regno << 4].green = green; | 353 | cfb->palette[regno << 4].green = green; |
| 356 | cfb->palette[regno << 4].blue = blue; | 354 | cfb->palette[regno << 4].blue = blue; |
| 357 | 355 | ||
| 358 | /* | 356 | /* |
| 359 | * The 5 bits of each colour component are | 357 | * The 5 bits of each colour component are |
| @@ -377,12 +375,12 @@ cyber2000fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
| 377 | 375 | ||
| 378 | /* | 376 | /* |
| 379 | * True colour: | 377 | * True colour: |
| 380 | * n rl | 378 | * n rl |
| 381 | * pixel --/--+--/--> red dac | 379 | * pixel --/--+--/--> red dac |
| 382 | * | gl | 380 | * | gl |
| 383 | * +--/--> green dac | 381 | * +--/--> green dac |
| 384 | * | bl | 382 | * | bl |
| 385 | * +--/--> blue dac | 383 | * +--/--> blue dac |
| 386 | * n = bpp, rl = red length, gl = green length, bl = blue length | 384 | * n = bpp, rl = red length, gl = green length, bl = blue length |
| 387 | */ | 385 | */ |
| 388 | case FB_VISUAL_TRUECOLOR: | 386 | case FB_VISUAL_TRUECOLOR: |
| @@ -494,9 +492,9 @@ static void cyber2000fb_set_timing(struct cfb_info *cfb, struct par_info *hw) | |||
| 494 | 492 | ||
| 495 | /* PLL registers */ | 493 | /* PLL registers */ |
| 496 | cyber2000_grphw(EXT_DCLK_MULT, hw->clock_mult, cfb); | 494 | cyber2000_grphw(EXT_DCLK_MULT, hw->clock_mult, cfb); |
| 497 | cyber2000_grphw(EXT_DCLK_DIV, hw->clock_div, cfb); | 495 | cyber2000_grphw(EXT_DCLK_DIV, hw->clock_div, cfb); |
| 498 | cyber2000_grphw(EXT_MCLK_MULT, cfb->mclk_mult, cfb); | 496 | cyber2000_grphw(EXT_MCLK_MULT, cfb->mclk_mult, cfb); |
| 499 | cyber2000_grphw(EXT_MCLK_DIV, cfb->mclk_div, cfb); | 497 | cyber2000_grphw(EXT_MCLK_DIV, cfb->mclk_div, cfb); |
| 500 | cyber2000_grphw(0x90, 0x01, cfb); | 498 | cyber2000_grphw(0x90, 0x01, cfb); |
| 501 | cyber2000_grphw(0xb9, 0x80, cfb); | 499 | cyber2000_grphw(0xb9, 0x80, cfb); |
| 502 | cyber2000_grphw(0xb9, 0x00, cfb); | 500 | cyber2000_grphw(0xb9, 0x00, cfb); |
| @@ -515,8 +513,8 @@ static void cyber2000fb_set_timing(struct cfb_info *cfb, struct par_info *hw) | |||
| 515 | /* | 513 | /* |
| 516 | * Set up accelerator registers | 514 | * Set up accelerator registers |
| 517 | */ | 515 | */ |
| 518 | cyber2000fb_writew(hw->width, CO_REG_SRC_WIDTH, cfb); | 516 | cyber2000fb_writew(hw->width, CO_REG_SRC_WIDTH, cfb); |
| 519 | cyber2000fb_writew(hw->width, CO_REG_DEST_WIDTH, cfb); | 517 | cyber2000fb_writew(hw->width, CO_REG_DEST_WIDTH, cfb); |
| 520 | cyber2000fb_writeb(hw->co_pixfmt, CO_REG_PIXFMT, cfb); | 518 | cyber2000fb_writeb(hw->co_pixfmt, CO_REG_PIXFMT, cfb); |
| 521 | } | 519 | } |
| 522 | 520 | ||
| @@ -549,15 +547,15 @@ cyber2000fb_decode_crtc(struct par_info *hw, struct cfb_info *cfb, | |||
| 549 | { | 547 | { |
| 550 | u_int Htotal, Hblankend, Hsyncend; | 548 | u_int Htotal, Hblankend, Hsyncend; |
| 551 | u_int Vtotal, Vdispend, Vblankstart, Vblankend, Vsyncstart, Vsyncend; | 549 | u_int Vtotal, Vdispend, Vblankstart, Vblankend, Vsyncstart, Vsyncend; |
| 552 | #define ENCODE_BIT(v,b1,m,b2) (((v >> b1) & m) << b2) | 550 | #define ENCODE_BIT(v, b1, m, b2) ((((v) >> (b1)) & (m)) << (b2)) |
| 553 | 551 | ||
| 554 | hw->crtc[13] = hw->pitch; | 552 | hw->crtc[13] = hw->pitch; |
| 555 | hw->crtc[17] = 0xe3; | 553 | hw->crtc[17] = 0xe3; |
| 556 | hw->crtc[14] = 0; | 554 | hw->crtc[14] = 0; |
| 557 | hw->crtc[8] = 0; | 555 | hw->crtc[8] = 0; |
| 558 | 556 | ||
| 559 | Htotal = var->xres + var->right_margin + | 557 | Htotal = var->xres + var->right_margin + |
| 560 | var->hsync_len + var->left_margin; | 558 | var->hsync_len + var->left_margin; |
| 561 | 559 | ||
| 562 | if (Htotal > 2080) | 560 | if (Htotal > 2080) |
| 563 | return -EINVAL; | 561 | return -EINVAL; |
| @@ -567,7 +565,7 @@ cyber2000fb_decode_crtc(struct par_info *hw, struct cfb_info *cfb, | |||
| 567 | hw->crtc[2] = var->xres >> 3; | 565 | hw->crtc[2] = var->xres >> 3; |
| 568 | hw->crtc[4] = (var->xres + var->right_margin) >> 3; | 566 | hw->crtc[4] = (var->xres + var->right_margin) >> 3; |
| 569 | 567 | ||
| 570 | Hblankend = (Htotal - 4*8) >> 3; | 568 | Hblankend = (Htotal - 4 * 8) >> 3; |
| 571 | 569 | ||
| 572 | hw->crtc[3] = ENCODE_BIT(Hblankend, 0, 0x1f, 0) | | 570 | hw->crtc[3] = ENCODE_BIT(Hblankend, 0, 0x1f, 0) | |
| 573 | ENCODE_BIT(1, 0, 0x01, 7); | 571 | ENCODE_BIT(1, 0, 0x01, 7); |
| @@ -593,13 +591,13 @@ cyber2000fb_decode_crtc(struct par_info *hw, struct cfb_info *cfb, | |||
| 593 | hw->crtc[7] = ENCODE_BIT(Vtotal, 8, 0x01, 0) | | 591 | hw->crtc[7] = ENCODE_BIT(Vtotal, 8, 0x01, 0) | |
| 594 | ENCODE_BIT(Vdispend, 8, 0x01, 1) | | 592 | ENCODE_BIT(Vdispend, 8, 0x01, 1) | |
| 595 | ENCODE_BIT(Vsyncstart, 8, 0x01, 2) | | 593 | ENCODE_BIT(Vsyncstart, 8, 0x01, 2) | |
| 596 | ENCODE_BIT(Vblankstart,8, 0x01, 3) | | 594 | ENCODE_BIT(Vblankstart, 8, 0x01, 3) | |
| 597 | ENCODE_BIT(1, 0, 0x01, 4) | | 595 | ENCODE_BIT(1, 0, 0x01, 4) | |
| 598 | ENCODE_BIT(Vtotal, 9, 0x01, 5) | | 596 | ENCODE_BIT(Vtotal, 9, 0x01, 5) | |
| 599 | ENCODE_BIT(Vdispend, 9, 0x01, 6) | | 597 | ENCODE_BIT(Vdispend, 9, 0x01, 6) | |
| 600 | ENCODE_BIT(Vsyncstart, 9, 0x01, 7); | 598 | ENCODE_BIT(Vsyncstart, 9, 0x01, 7); |
| 601 | hw->crtc[9] = ENCODE_BIT(0, 0, 0x1f, 0) | | 599 | hw->crtc[9] = ENCODE_BIT(0, 0, 0x1f, 0) | |
| 602 | ENCODE_BIT(Vblankstart,9, 0x01, 5) | | 600 | ENCODE_BIT(Vblankstart, 9, 0x01, 5) | |
| 603 | ENCODE_BIT(1, 0, 0x01, 6); | 601 | ENCODE_BIT(1, 0, 0x01, 6); |
| 604 | hw->crtc[10] = Vsyncstart; | 602 | hw->crtc[10] = Vsyncstart; |
| 605 | hw->crtc[11] = ENCODE_BIT(Vsyncend, 0, 0x0f, 0) | | 603 | hw->crtc[11] = ENCODE_BIT(Vsyncend, 0, 0x0f, 0) | |
| @@ -615,10 +613,10 @@ cyber2000fb_decode_crtc(struct par_info *hw, struct cfb_info *cfb, | |||
| 615 | * 4=LINECOMP:10 5-IVIDEO 6=FIXCNT | 613 | * 4=LINECOMP:10 5-IVIDEO 6=FIXCNT |
| 616 | */ | 614 | */ |
| 617 | hw->crtc_ofl = | 615 | hw->crtc_ofl = |
| 618 | ENCODE_BIT(Vtotal, 10, 0x01, 0) | | 616 | ENCODE_BIT(Vtotal, 10, 0x01, 0) | |
| 619 | ENCODE_BIT(Vdispend, 10, 0x01, 1) | | 617 | ENCODE_BIT(Vdispend, 10, 0x01, 1) | |
| 620 | ENCODE_BIT(Vsyncstart, 10, 0x01, 2) | | 618 | ENCODE_BIT(Vsyncstart, 10, 0x01, 2) | |
| 621 | ENCODE_BIT(Vblankstart,10, 0x01, 3) | | 619 | ENCODE_BIT(Vblankstart, 10, 0x01, 3) | |
| 622 | EXT_CRT_VRTOFL_LINECOMP10; | 620 | EXT_CRT_VRTOFL_LINECOMP10; |
| 623 | 621 | ||
| 624 | /* woody: set the interlaced bit... */ | 622 | /* woody: set the interlaced bit... */ |
| @@ -750,11 +748,11 @@ cyber2000fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |||
| 750 | var->red.msb_right = 0; | 748 | var->red.msb_right = 0; |
| 751 | var->green.msb_right = 0; | 749 | var->green.msb_right = 0; |
| 752 | var->blue.msb_right = 0; | 750 | var->blue.msb_right = 0; |
| 751 | var->transp.offset = 0; | ||
| 752 | var->transp.length = 0; | ||
| 753 | 753 | ||
| 754 | switch (var->bits_per_pixel) { | 754 | switch (var->bits_per_pixel) { |
| 755 | case 8: /* PSEUDOCOLOUR, 256 */ | 755 | case 8: /* PSEUDOCOLOUR, 256 */ |
| 756 | var->transp.offset = 0; | ||
| 757 | var->transp.length = 0; | ||
| 758 | var->red.offset = 0; | 756 | var->red.offset = 0; |
| 759 | var->red.length = 8; | 757 | var->red.length = 8; |
| 760 | var->green.offset = 0; | 758 | var->green.offset = 0; |
| @@ -766,8 +764,6 @@ cyber2000fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |||
| 766 | case 16:/* DIRECTCOLOUR, 64k or 32k */ | 764 | case 16:/* DIRECTCOLOUR, 64k or 32k */ |
| 767 | switch (var->green.length) { | 765 | switch (var->green.length) { |
| 768 | case 6: /* RGB565, 64k */ | 766 | case 6: /* RGB565, 64k */ |
| 769 | var->transp.offset = 0; | ||
| 770 | var->transp.length = 0; | ||
| 771 | var->red.offset = 11; | 767 | var->red.offset = 11; |
| 772 | var->red.length = 5; | 768 | var->red.length = 5; |
| 773 | var->green.offset = 5; | 769 | var->green.offset = 5; |
| @@ -778,8 +774,6 @@ cyber2000fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |||
| 778 | 774 | ||
| 779 | default: | 775 | default: |
| 780 | case 5: /* RGB555, 32k */ | 776 | case 5: /* RGB555, 32k */ |
| 781 | var->transp.offset = 0; | ||
| 782 | var->transp.length = 0; | ||
| 783 | var->red.offset = 10; | 777 | var->red.offset = 10; |
| 784 | var->red.length = 5; | 778 | var->red.length = 5; |
| 785 | var->green.offset = 5; | 779 | var->green.offset = 5; |
| @@ -802,8 +796,6 @@ cyber2000fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |||
| 802 | break; | 796 | break; |
| 803 | 797 | ||
| 804 | case 24:/* TRUECOLOUR, 16m */ | 798 | case 24:/* TRUECOLOUR, 16m */ |
| 805 | var->transp.offset = 0; | ||
| 806 | var->transp.length = 0; | ||
| 807 | var->red.offset = 16; | 799 | var->red.offset = 16; |
| 808 | var->red.length = 8; | 800 | var->red.length = 8; |
| 809 | var->green.offset = 8; | 801 | var->green.offset = 8; |
| @@ -830,7 +822,7 @@ cyber2000fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |||
| 830 | mem = var->xres_virtual * var->yres_virtual * (var->bits_per_pixel / 8); | 822 | mem = var->xres_virtual * var->yres_virtual * (var->bits_per_pixel / 8); |
| 831 | if (mem > cfb->fb.fix.smem_len) | 823 | if (mem > cfb->fb.fix.smem_len) |
| 832 | var->yres_virtual = cfb->fb.fix.smem_len * 8 / | 824 | var->yres_virtual = cfb->fb.fix.smem_len * 8 / |
| 833 | (var->bits_per_pixel * var->xres_virtual); | 825 | (var->bits_per_pixel * var->xres_virtual); |
| 834 | 826 | ||
| 835 | if (var->yres > var->yres_virtual) | 827 | if (var->yres > var->yres_virtual) |
| 836 | var->yres = var->yres_virtual; | 828 | var->yres = var->yres_virtual; |
| @@ -921,7 +913,7 @@ static int cyber2000fb_set_par(struct fb_info *info) | |||
| 921 | hw.fetch <<= 1; | 913 | hw.fetch <<= 1; |
| 922 | hw.fetch += 1; | 914 | hw.fetch += 1; |
| 923 | 915 | ||
| 924 | cfb->fb.fix.line_length = var->xres_virtual * var->bits_per_pixel / 8; | 916 | cfb->fb.fix.line_length = var->xres_virtual * var->bits_per_pixel / 8; |
| 925 | 917 | ||
| 926 | /* | 918 | /* |
| 927 | * Same here - if the size of the video mode exceeds the | 919 | * Same here - if the size of the video mode exceeds the |
| @@ -952,7 +944,6 @@ static int cyber2000fb_set_par(struct fb_info *info) | |||
| 952 | return 0; | 944 | return 0; |
| 953 | } | 945 | } |
| 954 | 946 | ||
| 955 | |||
| 956 | /* | 947 | /* |
| 957 | * Pan or Wrap the Display | 948 | * Pan or Wrap the Display |
| 958 | */ | 949 | */ |
| @@ -1002,15 +993,15 @@ static int cyber2000fb_blank(int blank, struct fb_info *info) | |||
| 1002 | switch (blank) { | 993 | switch (blank) { |
| 1003 | case FB_BLANK_POWERDOWN: /* powerdown - both sync lines down */ | 994 | case FB_BLANK_POWERDOWN: /* powerdown - both sync lines down */ |
| 1004 | sync = EXT_SYNC_CTL_VS_0 | EXT_SYNC_CTL_HS_0; | 995 | sync = EXT_SYNC_CTL_VS_0 | EXT_SYNC_CTL_HS_0; |
| 1005 | break; | 996 | break; |
| 1006 | case FB_BLANK_HSYNC_SUSPEND: /* hsync off */ | 997 | case FB_BLANK_HSYNC_SUSPEND: /* hsync off */ |
| 1007 | sync = EXT_SYNC_CTL_VS_NORMAL | EXT_SYNC_CTL_HS_0; | 998 | sync = EXT_SYNC_CTL_VS_NORMAL | EXT_SYNC_CTL_HS_0; |
| 1008 | break; | 999 | break; |
| 1009 | case FB_BLANK_VSYNC_SUSPEND: /* vsync off */ | 1000 | case FB_BLANK_VSYNC_SUSPEND: /* vsync off */ |
| 1010 | sync = EXT_SYNC_CTL_VS_0 | EXT_SYNC_CTL_HS_NORMAL; | 1001 | sync = EXT_SYNC_CTL_VS_0 | EXT_SYNC_CTL_HS_NORMAL; |
| 1011 | break; | 1002 | break; |
| 1012 | case FB_BLANK_NORMAL: /* soft blank */ | 1003 | case FB_BLANK_NORMAL: /* soft blank */ |
| 1013 | default: /* unblank */ | 1004 | default: /* unblank */ |
| 1014 | break; | 1005 | break; |
| 1015 | } | 1006 | } |
| 1016 | 1007 | ||
| @@ -1018,7 +1009,8 @@ static int cyber2000fb_blank(int blank, struct fb_info *info) | |||
| 1018 | 1009 | ||
| 1019 | if (blank <= 1) { | 1010 | if (blank <= 1) { |
| 1020 | /* turn on ramdacs */ | 1011 | /* turn on ramdacs */ |
| 1021 | cfb->ramdac_powerdown &= ~(RAMDAC_DACPWRDN | RAMDAC_BYPASS | RAMDAC_RAMPWRDN); | 1012 | cfb->ramdac_powerdown &= ~(RAMDAC_DACPWRDN | RAMDAC_BYPASS | |
| 1013 | RAMDAC_RAMPWRDN); | ||
| 1022 | cyber2000fb_write_ramdac_ctrl(cfb); | 1014 | cyber2000fb_write_ramdac_ctrl(cfb); |
| 1023 | } | 1015 | } |
| 1024 | 1016 | ||
| @@ -1043,7 +1035,8 @@ static int cyber2000fb_blank(int blank, struct fb_info *info) | |||
| 1043 | 1035 | ||
| 1044 | if (blank >= 2) { | 1036 | if (blank >= 2) { |
| 1045 | /* turn off ramdacs */ | 1037 | /* turn off ramdacs */ |
| 1046 | cfb->ramdac_powerdown |= RAMDAC_DACPWRDN | RAMDAC_BYPASS | RAMDAC_RAMPWRDN; | 1038 | cfb->ramdac_powerdown |= RAMDAC_DACPWRDN | RAMDAC_BYPASS | |
| 1039 | RAMDAC_RAMPWRDN; | ||
| 1047 | cyber2000fb_write_ramdac_ctrl(cfb); | 1040 | cyber2000fb_write_ramdac_ctrl(cfb); |
| 1048 | } | 1041 | } |
| 1049 | 1042 | ||
| @@ -1068,7 +1061,7 @@ static struct fb_ops cyber2000fb_ops = { | |||
| 1068 | * of this driver. It is here solely at the moment to support the other | 1061 | * of this driver. It is here solely at the moment to support the other |
| 1069 | * CyberPro modules external to this driver. | 1062 | * CyberPro modules external to this driver. |
| 1070 | */ | 1063 | */ |
| 1071 | static struct cfb_info *int_cfb_info; | 1064 | static struct cfb_info *int_cfb_info; |
| 1072 | 1065 | ||
| 1073 | /* | 1066 | /* |
| 1074 | * Enable access to the extended registers | 1067 | * Enable access to the extended registers |
| @@ -1085,6 +1078,7 @@ void cyber2000fb_enable_extregs(struct cfb_info *cfb) | |||
| 1085 | cyber2000_grphw(EXT_FUNC_CTL, old, cfb); | 1078 | cyber2000_grphw(EXT_FUNC_CTL, old, cfb); |
| 1086 | } | 1079 | } |
| 1087 | } | 1080 | } |
| 1081 | EXPORT_SYMBOL(cyber2000fb_enable_extregs); | ||
| 1088 | 1082 | ||
| 1089 | /* | 1083 | /* |
| 1090 | * Disable access to the extended registers | 1084 | * Disable access to the extended registers |
| @@ -1104,11 +1098,13 @@ void cyber2000fb_disable_extregs(struct cfb_info *cfb) | |||
| 1104 | else | 1098 | else |
| 1105 | cfb->func_use_count -= 1; | 1099 | cfb->func_use_count -= 1; |
| 1106 | } | 1100 | } |
| 1101 | EXPORT_SYMBOL(cyber2000fb_disable_extregs); | ||
| 1107 | 1102 | ||
| 1108 | void cyber2000fb_get_fb_var(struct cfb_info *cfb, struct fb_var_screeninfo *var) | 1103 | void cyber2000fb_get_fb_var(struct cfb_info *cfb, struct fb_var_screeninfo *var) |
| 1109 | { | 1104 | { |
| 1110 | memcpy(var, &cfb->fb.var, sizeof(struct fb_var_screeninfo)); | 1105 | memcpy(var, &cfb->fb.var, sizeof(struct fb_var_screeninfo)); |
| 1111 | } | 1106 | } |
| 1107 | EXPORT_SYMBOL(cyber2000fb_get_fb_var); | ||
| 1112 | 1108 | ||
| 1113 | /* | 1109 | /* |
| 1114 | * Attach a capture/tv driver to the core CyberX0X0 driver. | 1110 | * Attach a capture/tv driver to the core CyberX0X0 driver. |
| @@ -1122,13 +1118,15 @@ int cyber2000fb_attach(struct cyberpro_info *info, int idx) | |||
| 1122 | info->fb_size = int_cfb_info->fb.fix.smem_len; | 1118 | info->fb_size = int_cfb_info->fb.fix.smem_len; |
| 1123 | info->enable_extregs = cyber2000fb_enable_extregs; | 1119 | info->enable_extregs = cyber2000fb_enable_extregs; |
| 1124 | info->disable_extregs = cyber2000fb_disable_extregs; | 1120 | info->disable_extregs = cyber2000fb_disable_extregs; |
| 1125 | info->info = int_cfb_info; | 1121 | info->info = int_cfb_info; |
| 1126 | 1122 | ||
| 1127 | strlcpy(info->dev_name, int_cfb_info->fb.fix.id, sizeof(info->dev_name)); | 1123 | strlcpy(info->dev_name, int_cfb_info->fb.fix.id, |
| 1124 | sizeof(info->dev_name)); | ||
| 1128 | } | 1125 | } |
| 1129 | 1126 | ||
| 1130 | return int_cfb_info != NULL; | 1127 | return int_cfb_info != NULL; |
| 1131 | } | 1128 | } |
| 1129 | EXPORT_SYMBOL(cyber2000fb_attach); | ||
| 1132 | 1130 | ||
| 1133 | /* | 1131 | /* |
| 1134 | * Detach a capture/tv driver from the core CyberX0X0 driver. | 1132 | * Detach a capture/tv driver from the core CyberX0X0 driver. |
| @@ -1136,12 +1134,7 @@ int cyber2000fb_attach(struct cyberpro_info *info, int idx) | |||
| 1136 | void cyber2000fb_detach(int idx) | 1134 | void cyber2000fb_detach(int idx) |
| 1137 | { | 1135 | { |
| 1138 | } | 1136 | } |
| 1139 | |||
| 1140 | EXPORT_SYMBOL(cyber2000fb_attach); | ||
| 1141 | EXPORT_SYMBOL(cyber2000fb_detach); | 1137 | EXPORT_SYMBOL(cyber2000fb_detach); |
| 1142 | EXPORT_SYMBOL(cyber2000fb_enable_extregs); | ||
| 1143 | EXPORT_SYMBOL(cyber2000fb_disable_extregs); | ||
| 1144 | EXPORT_SYMBOL(cyber2000fb_get_fb_var); | ||
| 1145 | 1138 | ||
| 1146 | /* | 1139 | /* |
| 1147 | * These parameters give | 1140 | * These parameters give |
| @@ -1205,7 +1198,7 @@ static void cyberpro_init_hw(struct cfb_info *cfb) | |||
| 1205 | int i; | 1198 | int i; |
| 1206 | 1199 | ||
| 1207 | for (i = 0; i < sizeof(igs_regs); i += 2) | 1200 | for (i = 0; i < sizeof(igs_regs); i += 2) |
| 1208 | cyber2000_grphw(igs_regs[i], igs_regs[i+1], cfb); | 1201 | cyber2000_grphw(igs_regs[i], igs_regs[i + 1], cfb); |
| 1209 | 1202 | ||
| 1210 | if (cfb->id == ID_CYBERPRO_5000) { | 1203 | if (cfb->id == ID_CYBERPRO_5000) { |
| 1211 | unsigned char val; | 1204 | unsigned char val; |
| @@ -1215,8 +1208,8 @@ static void cyberpro_init_hw(struct cfb_info *cfb) | |||
| 1215 | } | 1208 | } |
| 1216 | } | 1209 | } |
| 1217 | 1210 | ||
| 1218 | static struct cfb_info * __devinit | 1211 | static struct cfb_info __devinit *cyberpro_alloc_fb_info(unsigned int id, |
| 1219 | cyberpro_alloc_fb_info(unsigned int id, char *name) | 1212 | char *name) |
| 1220 | { | 1213 | { |
| 1221 | struct cfb_info *cfb; | 1214 | struct cfb_info *cfb; |
| 1222 | 1215 | ||
| @@ -1228,9 +1221,9 @@ cyberpro_alloc_fb_info(unsigned int id, char *name) | |||
| 1228 | cfb->id = id; | 1221 | cfb->id = id; |
| 1229 | 1222 | ||
| 1230 | if (id == ID_CYBERPRO_5000) | 1223 | if (id == ID_CYBERPRO_5000) |
| 1231 | cfb->ref_ps = 40690; // 24.576 MHz | 1224 | cfb->ref_ps = 40690; /* 24.576 MHz */ |
| 1232 | else | 1225 | else |
| 1233 | cfb->ref_ps = 69842; // 14.31818 MHz (69841?) | 1226 | cfb->ref_ps = 69842; /* 14.31818 MHz (69841?) */ |
| 1234 | 1227 | ||
| 1235 | cfb->divisors[0] = 1; | 1228 | cfb->divisors[0] = 1; |
| 1236 | cfb->divisors[1] = 2; | 1229 | cfb->divisors[1] = 2; |
| @@ -1282,8 +1275,7 @@ cyberpro_alloc_fb_info(unsigned int id, char *name) | |||
| 1282 | return cfb; | 1275 | return cfb; |
| 1283 | } | 1276 | } |
| 1284 | 1277 | ||
| 1285 | static void | 1278 | static void cyberpro_free_fb_info(struct cfb_info *cfb) |
| 1286 | cyberpro_free_fb_info(struct cfb_info *cfb) | ||
| 1287 | { | 1279 | { |
| 1288 | if (cfb) { | 1280 | if (cfb) { |
| 1289 | /* | 1281 | /* |
| @@ -1300,8 +1292,7 @@ cyberpro_free_fb_info(struct cfb_info *cfb) | |||
| 1300 | * video=cyber2000:font:fontname | 1292 | * video=cyber2000:font:fontname |
| 1301 | */ | 1293 | */ |
| 1302 | #ifndef MODULE | 1294 | #ifndef MODULE |
| 1303 | static int | 1295 | static int cyber2000fb_setup(char *options) |
| 1304 | cyber2000fb_setup(char *options) | ||
| 1305 | { | 1296 | { |
| 1306 | char *opt; | 1297 | char *opt; |
| 1307 | 1298 | ||
| @@ -1315,7 +1306,8 @@ cyber2000fb_setup(char *options) | |||
| 1315 | if (strncmp(opt, "font:", 5) == 0) { | 1306 | if (strncmp(opt, "font:", 5) == 0) { |
| 1316 | static char default_font_storage[40]; | 1307 | static char default_font_storage[40]; |
| 1317 | 1308 | ||
| 1318 | strlcpy(default_font_storage, opt + 5, sizeof(default_font_storage)); | 1309 | strlcpy(default_font_storage, opt + 5, |
| 1310 | sizeof(default_font_storage)); | ||
| 1319 | default_font = default_font_storage; | 1311 | default_font = default_font_storage; |
| 1320 | continue; | 1312 | continue; |
| 1321 | } | 1313 | } |
| @@ -1354,10 +1346,18 @@ static int __devinit cyberpro_common_probe(struct cfb_info *cfb) | |||
| 1354 | * Determine the size of the memory. | 1346 | * Determine the size of the memory. |
| 1355 | */ | 1347 | */ |
| 1356 | switch (cfb->mem_ctl2 & MEM_CTL2_SIZE_MASK) { | 1348 | switch (cfb->mem_ctl2 & MEM_CTL2_SIZE_MASK) { |
| 1357 | case MEM_CTL2_SIZE_4MB: smem_size = 0x00400000; break; | 1349 | case MEM_CTL2_SIZE_4MB: |
| 1358 | case MEM_CTL2_SIZE_2MB: smem_size = 0x00200000; break; | 1350 | smem_size = 0x00400000; |
| 1359 | case MEM_CTL2_SIZE_1MB: smem_size = 0x00100000; break; | 1351 | break; |
| 1360 | default: smem_size = 0x00100000; break; | 1352 | case MEM_CTL2_SIZE_2MB: |
| 1353 | smem_size = 0x00200000; | ||
| 1354 | break; | ||
| 1355 | case MEM_CTL2_SIZE_1MB: | ||
| 1356 | smem_size = 0x00100000; | ||
| 1357 | break; | ||
| 1358 | default: | ||
| 1359 | smem_size = 0x00100000; | ||
| 1360 | break; | ||
| 1361 | } | 1361 | } |
| 1362 | 1362 | ||
| 1363 | cfb->fb.fix.smem_len = smem_size; | 1363 | cfb->fb.fix.smem_len = smem_size; |
| @@ -1366,8 +1366,8 @@ static int __devinit cyberpro_common_probe(struct cfb_info *cfb) | |||
| 1366 | 1366 | ||
| 1367 | err = -EINVAL; | 1367 | err = -EINVAL; |
| 1368 | if (!fb_find_mode(&cfb->fb.var, &cfb->fb, NULL, NULL, 0, | 1368 | if (!fb_find_mode(&cfb->fb.var, &cfb->fb, NULL, NULL, 0, |
| 1369 | &cyber2000fb_default_mode, 8)) { | 1369 | &cyber2000fb_default_mode, 8)) { |
| 1370 | printk("%s: no valid mode found\n", cfb->fb.fix.id); | 1370 | printk(KERN_ERR "%s: no valid mode found\n", cfb->fb.fix.id); |
| 1371 | goto failed; | 1371 | goto failed; |
| 1372 | } | 1372 | } |
| 1373 | 1373 | ||
| @@ -1377,7 +1377,7 @@ static int __devinit cyberpro_common_probe(struct cfb_info *cfb) | |||
| 1377 | if (cfb->fb.var.yres_virtual < cfb->fb.var.yres) | 1377 | if (cfb->fb.var.yres_virtual < cfb->fb.var.yres) |
| 1378 | cfb->fb.var.yres_virtual = cfb->fb.var.yres; | 1378 | cfb->fb.var.yres_virtual = cfb->fb.var.yres; |
| 1379 | 1379 | ||
| 1380 | // fb_set_var(&cfb->fb.var, -1, &cfb->fb); | 1380 | /* fb_set_var(&cfb->fb.var, -1, &cfb->fb); */ |
| 1381 | 1381 | ||
| 1382 | /* | 1382 | /* |
| 1383 | * Calculate the hsync and vsync frequencies. Note that | 1383 | * Calculate the hsync and vsync frequencies. Note that |
| @@ -1425,20 +1425,20 @@ static void cyberpro_common_resume(struct cfb_info *cfb) | |||
| 1425 | 1425 | ||
| 1426 | #include <asm/arch/hardware.h> | 1426 | #include <asm/arch/hardware.h> |
| 1427 | 1427 | ||
| 1428 | static int __devinit | 1428 | static int __devinit cyberpro_vl_probe(void) |
| 1429 | cyberpro_vl_probe(void) | ||
| 1430 | { | 1429 | { |
| 1431 | struct cfb_info *cfb; | 1430 | struct cfb_info *cfb; |
| 1432 | int err = -ENOMEM; | 1431 | int err = -ENOMEM; |
| 1433 | 1432 | ||
| 1434 | if (!request_mem_region(FB_START,FB_SIZE,"CyberPro2010")) return err; | 1433 | if (!request_mem_region(FB_START, FB_SIZE, "CyberPro2010")) |
| 1434 | return err; | ||
| 1435 | 1435 | ||
| 1436 | cfb = cyberpro_alloc_fb_info(ID_CYBERPRO_2010, "CyberPro2010"); | 1436 | cfb = cyberpro_alloc_fb_info(ID_CYBERPRO_2010, "CyberPro2010"); |
| 1437 | if (!cfb) | 1437 | if (!cfb) |
| 1438 | goto failed_release; | 1438 | goto failed_release; |
| 1439 | 1439 | ||
| 1440 | cfb->dev = NULL; | 1440 | cfb->dev = NULL; |
| 1441 | cfb->region = ioremap(FB_START,FB_SIZE); | 1441 | cfb->region = ioremap(FB_START, FB_SIZE); |
| 1442 | if (!cfb->region) | 1442 | if (!cfb->region) |
| 1443 | goto failed_ioremap; | 1443 | goto failed_ioremap; |
| 1444 | 1444 | ||
| @@ -1475,7 +1475,7 @@ failed: | |||
| 1475 | failed_ioremap: | 1475 | failed_ioremap: |
| 1476 | cyberpro_free_fb_info(cfb); | 1476 | cyberpro_free_fb_info(cfb); |
| 1477 | failed_release: | 1477 | failed_release: |
| 1478 | release_mem_region(FB_START,FB_SIZE); | 1478 | release_mem_region(FB_START, FB_SIZE); |
| 1479 | 1479 | ||
| 1480 | return err; | 1480 | return err; |
| 1481 | } | 1481 | } |
| @@ -1538,7 +1538,8 @@ static int cyberpro_pci_enable_mmio(struct cfb_info *cfb) | |||
| 1538 | * Allow the CyberPro to accept PCI burst accesses | 1538 | * Allow the CyberPro to accept PCI burst accesses |
| 1539 | */ | 1539 | */ |
| 1540 | if (cfb->id == ID_CYBERPRO_2010) { | 1540 | if (cfb->id == ID_CYBERPRO_2010) { |
| 1541 | printk(KERN_INFO "%s: NOT enabling PCI bursts\n", cfb->fb.fix.id); | 1541 | printk(KERN_INFO "%s: NOT enabling PCI bursts\n", |
| 1542 | cfb->fb.fix.id); | ||
| 1542 | } else { | 1543 | } else { |
| 1543 | val = cyber2000_grphr(EXT_BUS_CTL, cfb); | 1544 | val = cyber2000_grphr(EXT_BUS_CTL, cfb); |
| 1544 | if (!(val & EXT_BUS_CTL_PCIBURST_WRITE)) { | 1545 | if (!(val & EXT_BUS_CTL_PCIBURST_WRITE)) { |
| @@ -1688,9 +1689,10 @@ static int cyberpro_pci_resume(struct pci_dev *dev) | |||
| 1688 | } | 1689 | } |
| 1689 | 1690 | ||
| 1690 | static struct pci_device_id cyberpro_pci_table[] = { | 1691 | static struct pci_device_id cyberpro_pci_table[] = { |
| 1691 | // Not yet | 1692 | /* Not yet |
| 1692 | // { PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_1682, | 1693 | * { PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_1682, |
| 1693 | // PCI_ANY_ID, PCI_ANY_ID, 0, 0, ID_IGA_1682 }, | 1694 | * PCI_ANY_ID, PCI_ANY_ID, 0, 0, ID_IGA_1682 }, |
| 1695 | */ | ||
| 1694 | { PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_2000, | 1696 | { PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_2000, |
| 1695 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, ID_CYBERPRO_2000 }, | 1697 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, ID_CYBERPRO_2000 }, |
| 1696 | { PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_2010, | 1698 | { PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_2010, |
| @@ -1700,7 +1702,7 @@ static struct pci_device_id cyberpro_pci_table[] = { | |||
| 1700 | { 0, } | 1702 | { 0, } |
| 1701 | }; | 1703 | }; |
| 1702 | 1704 | ||
| 1703 | MODULE_DEVICE_TABLE(pci,cyberpro_pci_table); | 1705 | MODULE_DEVICE_TABLE(pci, cyberpro_pci_table); |
| 1704 | 1706 | ||
| 1705 | static struct pci_driver cyberpro_driver = { | 1707 | static struct pci_driver cyberpro_driver = { |
| 1706 | .name = "CyberPro", | 1708 | .name = "CyberPro", |
