Lines Matching +full:high +full:- +full:vt
1 // SPDX-License-Identifier: GPL-2.0-only
14 * I2C part copied from the i2c-voodoo3.c driver by:
17 * Ralph Metzler <rjkm@thp.uni-koeln.de>, and
45 * - multihead support (basically need to support an array of fb_infos)
46 * - support other architectures (PPC, Alpha); does the fact that the VGA
52 * 0.1.4 (released 2002-05-28) ported over to new fbdev api by James Simmons
54 * 0.1.3 (released 1999-11-02) added Attila's panning support, code
60 * 0.1.2 (released 1999-10-19) added Attila Kesmarki's bug fixes and
62 * 0.1.1 (released 1999-10-07) added Voodoo3 support by Harold Oga.
63 * 0.1.0 (released 1999-10-06) initial version
106 .height = -1,
107 .width = -1,
156 /* -------------------------------------------------------------------------
157 * Hardware-specific funcions
158 * ------------------------------------------------------------------------- */
162 return inb(par->iobase + reg - 0x300); in vga_inb()
167 outb(val, par->iobase + reg - 0x300); in vga_outb()
244 return readl(par->regbase_virt + reg); in tdfx_inl()
249 writel(val, par->regbase_virt + reg); in tdfx_outl()
256 while ((tdfx_inl(par, STATUS) & 0x1f) < size - 1) in banshee_make_room()
262 struct tdfx_par *par = info->par; in banshee_wait_idle()
296 for (k = 3; k >= 0; k--) { in do_calc_pll()
297 for (m = 63; m >= 0; m--) { in do_calc_pll()
302 int n_estimated = ((freq * (m + 2) << k) / fref) - 2; in do_calc_pll()
313 int error = abs(f - freq); in do_calc_pll()
339 struct tdfx_par *par = info->par; in do_write_regs()
349 tdfx_outl(par, VGAINIT1, reg->vgainit1 & 0x001FFFFF); in do_write_regs()
350 tdfx_outl(par, VIDPROCCFG, reg->vidcfg & ~0x00000001); in do_write_regs()
352 tdfx_outl(par, PLLCTRL1, reg->mempll); in do_write_regs()
353 tdfx_outl(par, PLLCTRL2, reg->gfxpll); in do_write_regs()
355 tdfx_outl(par, PLLCTRL0, reg->vidpll); in do_write_regs()
357 vga_outb(par, MISC_W, reg->misc[0x00] | 0x01); in do_write_regs()
360 seq_outb(par, i, reg->seq[i]); in do_write_regs()
363 crt_outb(par, i, reg->crt[i]); in do_write_regs()
366 gra_outb(par, i, reg->gra[i]); in do_write_regs()
369 att_outb(par, i, reg->att[i]); in do_write_regs()
371 crt_outb(par, 0x1a, reg->ext[0]); in do_write_regs()
372 crt_outb(par, 0x1b, reg->ext[1]); in do_write_regs()
378 tdfx_outl(par, VGAINIT0, reg->vgainit0); in do_write_regs()
379 tdfx_outl(par, DACMODE, reg->dacmode); in do_write_regs()
380 tdfx_outl(par, VIDDESKSTRIDE, reg->stride); in do_write_regs()
381 tdfx_outl(par, HWCURPATADDR, reg->curspataddr); in do_write_regs()
383 tdfx_outl(par, VIDSCREENSIZE, reg->screensize); in do_write_regs()
384 tdfx_outl(par, VIDDESKSTART, reg->startaddr); in do_write_regs()
385 tdfx_outl(par, VIDPROCCFG, reg->vidcfg); in do_write_regs()
386 tdfx_outl(par, VGAINIT1, reg->vgainit1); in do_write_regs()
387 tdfx_outl(par, MISCINIT0, reg->miscinit0); in do_write_regs()
390 tdfx_outl(par, SRCBASE, reg->startaddr); in do_write_regs()
391 tdfx_outl(par, DSTBASE, reg->startaddr); in do_write_regs()
433 /* ------------------------------------------------------------------------- */
437 struct tdfx_par *par = info->par; in tdfxfb_check_var()
440 if (var->bits_per_pixel != 8 && var->bits_per_pixel != 16 && in tdfxfb_check_var()
441 var->bits_per_pixel != 24 && var->bits_per_pixel != 32) { in tdfxfb_check_var()
442 DPRINTK("depth not supported: %u\n", var->bits_per_pixel); in tdfxfb_check_var()
443 return -EINVAL; in tdfxfb_check_var()
446 if (var->xres != var->xres_virtual) in tdfxfb_check_var()
447 var->xres_virtual = var->xres; in tdfxfb_check_var()
449 if (var->yres > var->yres_virtual) in tdfxfb_check_var()
450 var->yres_virtual = var->yres; in tdfxfb_check_var()
452 if (var->xoffset) { in tdfxfb_check_var()
454 return -EINVAL; in tdfxfb_check_var()
456 var->yoffset = 0; in tdfxfb_check_var()
464 if (((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) && in tdfxfb_check_var()
465 (par->max_pixclock < VOODOO3_MAX_PIXCLOCK)) { in tdfxfb_check_var()
467 return -EINVAL; in tdfxfb_check_var()
470 if (info->monspecs.hfmax && info->monspecs.vfmax && in tdfxfb_check_var()
471 info->monspecs.dclkmax && fb_validate_mode(var, info) < 0) { in tdfxfb_check_var()
473 return -EINVAL; in tdfxfb_check_var()
476 var->xres = (var->xres + 15) & ~15; /* could sometimes be 8 */ in tdfxfb_check_var()
477 lpitch = var->xres * ((var->bits_per_pixel + 7) >> 3); in tdfxfb_check_var()
479 if (var->xres < 320 || var->xres > 2048) { in tdfxfb_check_var()
480 DPRINTK("width not supported: %u\n", var->xres); in tdfxfb_check_var()
481 return -EINVAL; in tdfxfb_check_var()
484 if (var->yres < 200 || var->yres > 2048) { in tdfxfb_check_var()
485 DPRINTK("height not supported: %u\n", var->yres); in tdfxfb_check_var()
486 return -EINVAL; in tdfxfb_check_var()
489 if (lpitch * var->yres_virtual > info->fix.smem_len) { in tdfxfb_check_var()
490 var->yres_virtual = info->fix.smem_len / lpitch; in tdfxfb_check_var()
491 if (var->yres_virtual < var->yres) { in tdfxfb_check_var()
493 var->xres, var->yres_virtual, in tdfxfb_check_var()
494 var->bits_per_pixel); in tdfxfb_check_var()
495 return -EINVAL; in tdfxfb_check_var()
499 if (PICOS2KHZ(var->pixclock) > par->max_pixclock) { in tdfxfb_check_var()
500 DPRINTK("pixclock too high (%ldKHz)\n", in tdfxfb_check_var()
501 PICOS2KHZ(var->pixclock)); in tdfxfb_check_var()
502 return -EINVAL; in tdfxfb_check_var()
505 var->transp.offset = 0; in tdfxfb_check_var()
506 var->transp.length = 0; in tdfxfb_check_var()
507 switch (var->bits_per_pixel) { in tdfxfb_check_var()
509 var->red.length = 8; in tdfxfb_check_var()
510 var->red.offset = 0; in tdfxfb_check_var()
511 var->green = var->red; in tdfxfb_check_var()
512 var->blue = var->red; in tdfxfb_check_var()
515 var->red.offset = 11; in tdfxfb_check_var()
516 var->red.length = 5; in tdfxfb_check_var()
517 var->green.offset = 5; in tdfxfb_check_var()
518 var->green.length = 6; in tdfxfb_check_var()
519 var->blue.offset = 0; in tdfxfb_check_var()
520 var->blue.length = 5; in tdfxfb_check_var()
523 var->transp.offset = 24; in tdfxfb_check_var()
524 var->transp.length = 8; in tdfxfb_check_var()
527 var->red.offset = 16; in tdfxfb_check_var()
528 var->green.offset = 8; in tdfxfb_check_var()
529 var->blue.offset = 0; in tdfxfb_check_var()
530 var->red.length = var->green.length = var->blue.length = 8; in tdfxfb_check_var()
533 var->width = -1; in tdfxfb_check_var()
534 var->height = -1; in tdfxfb_check_var()
536 var->accel_flags = FB_ACCELF_TEXT; in tdfxfb_check_var()
539 var->xres, var->yres, var->bits_per_pixel); in tdfxfb_check_var()
545 struct tdfx_par *par = info->par; in tdfxfb_set_par()
546 u32 hdispend = info->var.xres; in tdfxfb_set_par()
547 u32 hsyncsta = hdispend + info->var.right_margin; in tdfxfb_set_par()
548 u32 hsyncend = hsyncsta + info->var.hsync_len; in tdfxfb_set_par()
549 u32 htotal = hsyncend + info->var.left_margin; in tdfxfb_set_par()
551 u32 vd, vs, ve, vt, vbs, vbe; in tdfxfb_set_par() local
555 u32 cpp = (info->var.bits_per_pixel + 7) >> 3; in tdfxfb_set_par()
561 ((cpp - 1) << VIDCFG_PIXFMT_SHIFT) | in tdfxfb_set_par()
565 freq = PICOS2KHZ(info->var.pixclock); in tdfxfb_set_par()
569 if (freq > par->max_pixclock / 2) { in tdfxfb_set_par()
570 freq = freq > par->max_pixclock ? par->max_pixclock : freq; in tdfxfb_set_par()
579 wd = (hdispend >> 3) - 1; in tdfxfb_set_par()
581 hs = (hsyncsta >> 3) - 1; in tdfxfb_set_par()
582 he = (hsyncend >> 3) - 1; in tdfxfb_set_par()
583 ht = (htotal >> 3) - 1; in tdfxfb_set_par()
587 if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) { in tdfxfb_set_par()
588 vd = (info->var.yres << 1) - 1; in tdfxfb_set_par()
589 vs = vd + (info->var.lower_margin << 1); in tdfxfb_set_par()
590 ve = vs + (info->var.vsync_len << 1); in tdfxfb_set_par()
591 vt = ve + (info->var.upper_margin << 1) - 1; in tdfxfb_set_par()
592 reg.screensize = info->var.xres | (info->var.yres << 13); in tdfxfb_set_par()
596 vd = info->var.yres - 1; in tdfxfb_set_par()
597 vs = vd + info->var.lower_margin; in tdfxfb_set_par()
598 ve = vs + info->var.vsync_len; in tdfxfb_set_par()
599 vt = ve + info->var.upper_margin - 1; in tdfxfb_set_par()
600 reg.screensize = info->var.xres | (info->var.yres << 12); in tdfxfb_set_par()
604 vbe = vt; in tdfxfb_set_par()
608 (info->var.xres < 400 ? 0xa0 : in tdfxfb_set_par()
609 info->var.xres < 480 ? 0x60 : in tdfxfb_set_par()
610 info->var.xres < 768 ? 0xe0 : 0x20); in tdfxfb_set_par()
642 reg.crt[0x00] = ht - 4; in tdfxfb_set_par()
648 reg.crt[0x06] = vt; in tdfxfb_set_par()
651 ((vt & 0x200) >> 4) | 0x10 | in tdfxfb_set_par()
655 ((vt & 0x100) >> 8); in tdfxfb_set_par()
673 reg.ext[0x01] = (((vt & 0x400) >> 10) | in tdfxfb_set_par()
686 reg.curspataddr = info->fix.smem_len; in tdfxfb_set_par()
693 reg.stride = info->var.xres * cpp; in tdfxfb_set_par()
694 reg.startaddr = info->var.yoffset * reg.stride in tdfxfb_set_par()
695 + info->var.xoffset * cpp; in tdfxfb_set_par()
703 if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) in tdfxfb_set_par()
708 switch (info->var.bits_per_pixel) { in tdfxfb_set_par()
727 info->fix.line_length = reg.stride; in tdfxfb_set_par()
728 info->fix.visual = (info->var.bits_per_pixel == 8) in tdfxfb_set_par()
732 info->var.xres, info->var.yres, info->var.bits_per_pixel); in tdfxfb_set_par()
737 #define CNVT_TOHW(val, width) ((((val) << (width)) + 0x7FFF - (val)) >> 16)
743 struct tdfx_par *par = info->par; in tdfxfb_setcolreg()
746 if (regno >= info->cmap.len || regno > 255) in tdfxfb_setcolreg()
750 if (info->var.grayscale) { in tdfxfb_setcolreg()
757 switch (info->fix.visual) { in tdfxfb_setcolreg()
767 rgbcol = (CNVT_TOHW(red, info->var.red.length) << in tdfxfb_setcolreg()
768 info->var.red.offset) | in tdfxfb_setcolreg()
769 (CNVT_TOHW(green, info->var.green.length) << in tdfxfb_setcolreg()
770 info->var.green.offset) | in tdfxfb_setcolreg()
771 (CNVT_TOHW(blue, info->var.blue.length) << in tdfxfb_setcolreg()
772 info->var.blue.offset) | in tdfxfb_setcolreg()
773 (CNVT_TOHW(transp, info->var.transp.length) << in tdfxfb_setcolreg()
774 info->var.transp.offset); in tdfxfb_setcolreg()
775 par->palette[regno] = rgbcol; in tdfxfb_setcolreg()
780 DPRINTK("bad depth %u\n", info->var.bits_per_pixel); in tdfxfb_setcolreg()
790 struct tdfx_par *par = info->par; in tdfxfb_blank()
823 * Set the starting position of the visible screen to var->yoffset
828 struct tdfx_par *par = info->par; in tdfxfb_pan_display()
829 u32 addr = var->yoffset * info->fix.line_length; in tdfxfb_pan_display()
831 if (nopan || var->xoffset) in tdfxfb_pan_display()
832 return -EINVAL; in tdfxfb_pan_display()
847 struct tdfx_par *par = info->par; in tdfxfb_fillrect()
848 u32 bpp = info->var.bits_per_pixel; in tdfxfb_fillrect()
849 u32 stride = info->fix.line_length; in tdfxfb_fillrect()
852 u32 dx = rect->dx; in tdfxfb_fillrect()
853 u32 dy = rect->dy; in tdfxfb_fillrect()
856 if (rect->rop == ROP_COPY) in tdfxfb_fillrect()
861 /* assume always rect->height < 4096 */ in tdfxfb_fillrect()
862 if (dy + rect->height > 4095) { in tdfxfb_fillrect()
866 /* assume always rect->width < 4096 */ in tdfxfb_fillrect()
867 if (dx + rect->width > 4095) { in tdfxfb_fillrect()
873 if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR) { in tdfxfb_fillrect()
874 tdfx_outl(par, COLORFORE, rect->color); in tdfxfb_fillrect()
876 tdfx_outl(par, COLORFORE, par->palette[rect->color]); in tdfxfb_fillrect()
880 tdfx_outl(par, DSTSIZE, rect->width | (rect->height << 16)); in tdfxfb_fillrect()
885 * Screen-to-Screen BitBlt 2D command (for the bmove fb op.)
890 struct tdfx_par *par = info->par; in tdfxfb_copyarea()
891 u32 sx = area->sx, sy = area->sy, dx = area->dx, dy = area->dy; in tdfxfb_copyarea()
892 u32 bpp = info->var.bits_per_pixel; in tdfxfb_copyarea()
893 u32 stride = info->fix.line_length; in tdfxfb_copyarea()
899 /* assume always area->height < 4096 */ in tdfxfb_copyarea()
900 if (sy + area->height > 4095) { in tdfxfb_copyarea()
904 /* assume always area->width < 4096 */ in tdfxfb_copyarea()
905 if (sx + area->width > 4095) { in tdfxfb_copyarea()
909 /* assume always area->height < 4096 */ in tdfxfb_copyarea()
910 if (dy + area->height > 4095) { in tdfxfb_copyarea()
914 /* assume always area->width < 4096 */ in tdfxfb_copyarea()
915 if (dx + area->width > 4095) { in tdfxfb_copyarea()
920 if (area->sx <= area->dx) { in tdfxfb_copyarea()
921 /* -X */ in tdfxfb_copyarea()
923 sx += area->width - 1; in tdfxfb_copyarea()
924 dx += area->width - 1; in tdfxfb_copyarea()
926 if (area->sy <= area->dy) { in tdfxfb_copyarea()
927 /* -Y */ in tdfxfb_copyarea()
929 sy += area->height - 1; in tdfxfb_copyarea()
930 dy += area->height - 1; in tdfxfb_copyarea()
938 tdfx_outl(par, DSTSIZE, area->width | (area->height << 16)); in tdfxfb_copyarea()
947 struct tdfx_par *par = info->par; in tdfxfb_imageblit()
948 int size = image->height * ((image->width * image->depth + 7) >> 3); in tdfxfb_imageblit()
950 int i, stride = info->fix.line_length; in tdfxfb_imageblit()
951 u32 bpp = info->var.bits_per_pixel; in tdfxfb_imageblit()
953 u8 *chardata = (u8 *) image->data; in tdfxfb_imageblit()
955 u32 dx = image->dx; in tdfxfb_imageblit()
956 u32 dy = image->dy; in tdfxfb_imageblit()
959 if (image->depth != 1) { in tdfxfb_imageblit()
970 switch (info->fix.visual) { in tdfxfb_imageblit()
972 tdfx_outl(par, COLORFORE, image->fg_color); in tdfxfb_imageblit()
973 tdfx_outl(par, COLORBACK, image->bg_color); in tdfxfb_imageblit()
978 par->palette[image->fg_color]); in tdfxfb_imageblit()
980 par->palette[image->bg_color]); in tdfxfb_imageblit()
987 /* assume always image->height < 4096 */ in tdfxfb_imageblit()
988 if (dy + image->height > 4095) { in tdfxfb_imageblit()
992 /* assume always image->width < 4096 */ in tdfxfb_imageblit()
993 if (dx + image->width > 4095) { in tdfxfb_imageblit()
1005 tdfx_outl(par, DSTSIZE, image->width | (image->height << 16)); in tdfxfb_imageblit()
1012 for (i = (size >> 2); i > 0; i--) { in tdfxfb_imageblit()
1013 if (--fifo_free < 0) { in tdfxfb_imageblit()
1042 struct tdfx_par *par = info->par; in tdfxfb_cursor()
1046 return -EINVAL; /* just to force soft_cursor() call */ in tdfxfb_cursor()
1048 /* Too large of a cursor or wrong bpp :-( */ in tdfxfb_cursor()
1049 if (cursor->image.width > 64 || in tdfxfb_cursor()
1050 cursor->image.height > 64 || in tdfxfb_cursor()
1051 cursor->image.depth > 1) in tdfxfb_cursor()
1052 return -EINVAL; in tdfxfb_cursor()
1055 if (cursor->enable) in tdfxfb_cursor()
1065 if (!cursor->set) in tdfxfb_cursor()
1068 /* fix cursor color - XFree86 forgets to restore it properly */ in tdfxfb_cursor()
1069 if (cursor->set & FB_CUR_SETCMAP) { in tdfxfb_cursor()
1070 struct fb_cmap cmap = info->cmap; in tdfxfb_cursor()
1071 u32 bg_idx = cursor->image.bg_color; in tdfxfb_cursor()
1072 u32 fg_idx = cursor->image.fg_color; in tdfxfb_cursor()
1086 if (cursor->set & FB_CUR_SETPOS) { in tdfxfb_cursor()
1087 int x = cursor->image.dx; in tdfxfb_cursor()
1088 int y = cursor->image.dy - info->var.yoffset; in tdfxfb_cursor()
1095 if (cursor->set & (FB_CUR_SETIMAGE | FB_CUR_SETSHAPE)) { in tdfxfb_cursor()
1102 * Each pattern is a bitmap of 64 bit wide and 64 bit high in tdfxfb_cursor()
1114 u8 __iomem *cursorbase = info->screen_base + info->fix.smem_len; in tdfxfb_cursor()
1115 u8 *bitmap = (u8 *)cursor->image.data; in tdfxfb_cursor()
1116 u8 *mask = (u8 *)cursor->mask; in tdfxfb_cursor()
1121 for (i = 0; i < cursor->image.height; i++) { in tdfxfb_cursor()
1123 int j = (cursor->image.width + 7) >> 3; in tdfxfb_cursor()
1125 for (; j > 0; j--) { in tdfxfb_cursor()
1127 if (cursor->rop == ROP_COPY) in tdfxfb_cursor()
1170 struct tdfx_par *par = chan->par; in tdfxfb_i2c_setscl()
1185 struct tdfx_par *par = chan->par; in tdfxfb_i2c_setsda()
1198 We rely on the i2c-algo-bit routines to set the pins high before
1204 struct tdfx_par *par = chan->par; in tdfxfb_i2c_getscl()
1212 struct tdfx_par *par = chan->par; in tdfxfb_i2c_getsda()
1220 struct tdfx_par *par = chan->par; in tdfxfb_ddc_setscl()
1235 struct tdfx_par *par = chan->par; in tdfxfb_ddc_setsda()
1250 struct tdfx_par *par = chan->par; in tdfxfb_ddc_getscl()
1258 struct tdfx_par *par = chan->par; in tdfxfb_ddc_getsda()
1268 strscpy(chan->adapter.name, name, sizeof(chan->adapter.name)); in tdfxfb_setup_ddc_bus()
1269 chan->adapter.owner = THIS_MODULE; in tdfxfb_setup_ddc_bus()
1270 chan->adapter.class = I2C_CLASS_DDC; in tdfxfb_setup_ddc_bus()
1271 chan->adapter.algo_data = &chan->algo; in tdfxfb_setup_ddc_bus()
1272 chan->adapter.dev.parent = dev; in tdfxfb_setup_ddc_bus()
1273 chan->algo.setsda = tdfxfb_ddc_setsda; in tdfxfb_setup_ddc_bus()
1274 chan->algo.setscl = tdfxfb_ddc_setscl; in tdfxfb_setup_ddc_bus()
1275 chan->algo.getsda = tdfxfb_ddc_getsda; in tdfxfb_setup_ddc_bus()
1276 chan->algo.getscl = tdfxfb_ddc_getscl; in tdfxfb_setup_ddc_bus()
1277 chan->algo.udelay = 10; in tdfxfb_setup_ddc_bus()
1278 chan->algo.timeout = msecs_to_jiffies(500); in tdfxfb_setup_ddc_bus()
1279 chan->algo.data = chan; in tdfxfb_setup_ddc_bus()
1281 i2c_set_adapdata(&chan->adapter, chan); in tdfxfb_setup_ddc_bus()
1283 rc = i2c_bit_add_bus(&chan->adapter); in tdfxfb_setup_ddc_bus()
1287 chan->par = NULL; in tdfxfb_setup_ddc_bus()
1297 strscpy(chan->adapter.name, name, sizeof(chan->adapter.name)); in tdfxfb_setup_i2c_bus()
1298 chan->adapter.owner = THIS_MODULE; in tdfxfb_setup_i2c_bus()
1299 chan->adapter.algo_data = &chan->algo; in tdfxfb_setup_i2c_bus()
1300 chan->adapter.dev.parent = dev; in tdfxfb_setup_i2c_bus()
1301 chan->algo.setsda = tdfxfb_i2c_setsda; in tdfxfb_setup_i2c_bus()
1302 chan->algo.setscl = tdfxfb_i2c_setscl; in tdfxfb_setup_i2c_bus()
1303 chan->algo.getsda = tdfxfb_i2c_getsda; in tdfxfb_setup_i2c_bus()
1304 chan->algo.getscl = tdfxfb_i2c_getscl; in tdfxfb_setup_i2c_bus()
1305 chan->algo.udelay = 10; in tdfxfb_setup_i2c_bus()
1306 chan->algo.timeout = msecs_to_jiffies(500); in tdfxfb_setup_i2c_bus()
1307 chan->algo.data = chan; in tdfxfb_setup_i2c_bus()
1309 i2c_set_adapdata(&chan->adapter, chan); in tdfxfb_setup_i2c_bus()
1311 rc = i2c_bit_add_bus(&chan->adapter); in tdfxfb_setup_i2c_bus()
1315 chan->par = NULL; in tdfxfb_setup_i2c_bus()
1322 struct tdfx_par *par = info->par; in tdfxfb_create_i2c_busses()
1327 par->chan[0].par = par; in tdfxfb_create_i2c_busses()
1328 par->chan[1].par = par; in tdfxfb_create_i2c_busses()
1330 tdfxfb_setup_ddc_bus(&par->chan[0], "Voodoo3-DDC", info->device); in tdfxfb_create_i2c_busses()
1331 tdfxfb_setup_i2c_bus(&par->chan[1], "Voodoo3-I2C", info->device); in tdfxfb_create_i2c_busses()
1336 if (par->chan[0].par) in tdfxfb_delete_i2c_busses()
1337 i2c_del_adapter(&par->chan[0].adapter); in tdfxfb_delete_i2c_busses()
1338 par->chan[0].par = NULL; in tdfxfb_delete_i2c_busses()
1340 if (par->chan[1].par) in tdfxfb_delete_i2c_busses()
1341 i2c_del_adapter(&par->chan[1].adapter); in tdfxfb_delete_i2c_busses()
1342 par->chan[1].par = NULL; in tdfxfb_delete_i2c_busses()
1351 if (par->chan[0].par) in tdfxfb_probe_i2c_connector()
1352 edid = fb_ddc_read(&par->chan[0].adapter); in tdfxfb_probe_i2c_connector()
1364 * tdfxfb_probe - Device Initializiation
1390 info = framebuffer_alloc(sizeof(struct tdfx_par), &pdev->dev); in tdfxfb_probe()
1393 return -ENOMEM; in tdfxfb_probe()
1395 default_par = info->par; in tdfxfb_probe()
1396 info->fix = tdfx_fix; in tdfxfb_probe()
1399 switch (pdev->device) { in tdfxfb_probe()
1401 strcpy(info->fix.id, "3Dfx Banshee"); in tdfxfb_probe()
1402 default_par->max_pixclock = BANSHEE_MAX_PIXCLOCK; in tdfxfb_probe()
1405 strcpy(info->fix.id, "3Dfx Voodoo3"); in tdfxfb_probe()
1406 default_par->max_pixclock = VOODOO3_MAX_PIXCLOCK; in tdfxfb_probe()
1409 strcpy(info->fix.id, "3Dfx Voodoo5"); in tdfxfb_probe()
1410 default_par->max_pixclock = VOODOO5_MAX_PIXCLOCK; in tdfxfb_probe()
1414 info->fix.mmio_start = pci_resource_start(pdev, 0); in tdfxfb_probe()
1415 info->fix.mmio_len = pci_resource_len(pdev, 0); in tdfxfb_probe()
1416 if (!request_mem_region(info->fix.mmio_start, info->fix.mmio_len, in tdfxfb_probe()
1422 default_par->regbase_virt = in tdfxfb_probe()
1423 ioremap(info->fix.mmio_start, info->fix.mmio_len); in tdfxfb_probe()
1424 if (!default_par->regbase_virt) { in tdfxfb_probe()
1426 info->fix.id); in tdfxfb_probe()
1430 info->fix.smem_start = pci_resource_start(pdev, 1); in tdfxfb_probe()
1431 info->fix.smem_len = do_lfb_size(default_par, pdev->device); in tdfxfb_probe()
1432 if (!info->fix.smem_len) { in tdfxfb_probe()
1433 printk(KERN_ERR "fb: Can't count %s memory.\n", info->fix.id); in tdfxfb_probe()
1437 if (!request_mem_region(info->fix.smem_start, in tdfxfb_probe()
1443 info->screen_base = ioremap_wc(info->fix.smem_start, in tdfxfb_probe()
1444 info->fix.smem_len); in tdfxfb_probe()
1445 if (!info->screen_base) { in tdfxfb_probe()
1447 info->fix.id); in tdfxfb_probe()
1451 default_par->iobase = pci_resource_start(pdev, 2); in tdfxfb_probe()
1459 printk(KERN_INFO "fb: %s memory = %dK\n", info->fix.id, in tdfxfb_probe()
1460 info->fix.smem_len >> 10); in tdfxfb_probe()
1463 default_par->wc_cookie= arch_phys_wc_add(info->fix.smem_start, in tdfxfb_probe()
1464 info->fix.smem_len); in tdfxfb_probe()
1466 info->fix.ypanstep = nopan ? 0 : 1; in tdfxfb_probe()
1467 info->fix.ywrapstep = nowrap ? 0 : 1; in tdfxfb_probe()
1469 info->fbops = &tdfxfb_ops; in tdfxfb_probe()
1470 info->pseudo_palette = default_par->palette; in tdfxfb_probe()
1471 info->flags = FBINFO_HWACCEL_YPAN; in tdfxfb_probe()
1473 info->flags |= FBINFO_HWACCEL_FILLRECT | in tdfxfb_probe()
1481 info->fix.smem_len = (info->fix.smem_len - 1024) & in tdfxfb_probe()
1483 specs = &info->monspecs; in tdfxfb_probe()
1485 info->var.bits_per_pixel = 8; in tdfxfb_probe()
1491 if (specs->modedb == NULL) in tdfxfb_probe()
1496 fb_videomode_to_modelist(specs->modedb, in tdfxfb_probe()
1497 specs->modedb_len, in tdfxfb_probe()
1498 &info->modelist); in tdfxfb_probe()
1499 m = fb_find_best_display(specs, &info->modelist); in tdfxfb_probe()
1501 fb_videomode_to_var(&info->var, m); in tdfxfb_probe()
1502 /* fill all other info->var's fields */ in tdfxfb_probe()
1503 if (tdfxfb_check_var(&info->var, info) < 0) in tdfxfb_probe()
1504 info->var = tdfx_var; in tdfxfb_probe()
1515 err = fb_find_mode(&info->var, info, mode_option, in tdfxfb_probe()
1516 specs->modedb, specs->modedb_len, in tdfxfb_probe()
1517 NULL, info->var.bits_per_pixel); in tdfxfb_probe()
1519 info->var = tdfx_var; in tdfxfb_probe()
1523 fb_destroy_modedb(specs->modedb); in tdfxfb_probe()
1524 specs->modedb = NULL; in tdfxfb_probe()
1528 lpitch = info->var.xres_virtual * ((info->var.bits_per_pixel + 7) >> 3); in tdfxfb_probe()
1529 info->var.yres_virtual = info->fix.smem_len / lpitch; in tdfxfb_probe()
1530 if (info->var.yres_virtual < info->var.yres) in tdfxfb_probe()
1533 if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) { in tdfxfb_probe()
1540 fb_dealloc_cmap(&info->cmap); in tdfxfb_probe()
1553 arch_phys_wc_del(default_par->wc_cookie); in tdfxfb_probe()
1557 if (info->screen_base) in tdfxfb_probe()
1558 iounmap(info->screen_base); in tdfxfb_probe()
1559 release_mem_region(info->fix.smem_start, pci_resource_len(pdev, 1)); in tdfxfb_probe()
1564 if (default_par->regbase_virt) in tdfxfb_probe()
1565 iounmap(default_par->regbase_virt); in tdfxfb_probe()
1566 release_mem_region(info->fix.mmio_start, info->fix.mmio_len); in tdfxfb_probe()
1569 return -ENXIO; in tdfxfb_probe()
1599 * tdfxfb_remove - Device removal
1610 struct tdfx_par *par = info->par; in tdfxfb_remove()
1616 arch_phys_wc_del(par->wc_cookie); in tdfxfb_remove()
1617 iounmap(par->regbase_virt); in tdfxfb_remove()
1618 iounmap(info->screen_base); in tdfxfb_remove()
1627 fb_dealloc_cmap(&info->cmap); in tdfxfb_remove()
1638 return -ENODEV; in tdfxfb_init()
1642 return -ENODEV; in tdfxfb_init()
1662 MODULE_PARM_DESC(mode_option, "Initial video mode e.g. '648x480-8@60'");