Lines Matching +full:smem +full:- +full:part

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
105 .height = -1,
106 .width = -1,
155 /* -------------------------------------------------------------------------
156 * Hardware-specific funcions
157 * ------------------------------------------------------------------------- */
161 return inb(par->iobase + reg - 0x300); in vga_inb()
166 outb(val, par->iobase + reg - 0x300); in vga_outb()
243 return readl(par->regbase_virt + reg); in tdfx_inl()
248 writel(val, par->regbase_virt + reg); in tdfx_outl()
255 while ((tdfx_inl(par, STATUS) & 0x1f) < size - 1) in banshee_make_room()
261 struct tdfx_par *par = info->par; in banshee_wait_idle()
295 for (k = 3; k >= 0; k--) { in do_calc_pll()
296 for (m = 63; m >= 0; m--) { in do_calc_pll()
301 int n_estimated = ((freq * (m + 2) << k) / fref) - 2; in do_calc_pll()
312 int error = abs(f - freq); in do_calc_pll()
338 struct tdfx_par *par = info->par; in do_write_regs()
348 tdfx_outl(par, VGAINIT1, reg->vgainit1 & 0x001FFFFF); in do_write_regs()
349 tdfx_outl(par, VIDPROCCFG, reg->vidcfg & ~0x00000001); in do_write_regs()
351 tdfx_outl(par, PLLCTRL1, reg->mempll); in do_write_regs()
352 tdfx_outl(par, PLLCTRL2, reg->gfxpll); in do_write_regs()
354 tdfx_outl(par, PLLCTRL0, reg->vidpll); in do_write_regs()
356 vga_outb(par, MISC_W, reg->misc[0x00] | 0x01); in do_write_regs()
359 seq_outb(par, i, reg->seq[i]); in do_write_regs()
362 crt_outb(par, i, reg->crt[i]); in do_write_regs()
365 gra_outb(par, i, reg->gra[i]); in do_write_regs()
368 att_outb(par, i, reg->att[i]); in do_write_regs()
370 crt_outb(par, 0x1a, reg->ext[0]); in do_write_regs()
371 crt_outb(par, 0x1b, reg->ext[1]); in do_write_regs()
377 tdfx_outl(par, VGAINIT0, reg->vgainit0); in do_write_regs()
378 tdfx_outl(par, DACMODE, reg->dacmode); in do_write_regs()
379 tdfx_outl(par, VIDDESKSTRIDE, reg->stride); in do_write_regs()
380 tdfx_outl(par, HWCURPATADDR, reg->curspataddr); in do_write_regs()
382 tdfx_outl(par, VIDSCREENSIZE, reg->screensize); in do_write_regs()
383 tdfx_outl(par, VIDDESKSTART, reg->startaddr); in do_write_regs()
384 tdfx_outl(par, VIDPROCCFG, reg->vidcfg); in do_write_regs()
385 tdfx_outl(par, VGAINIT1, reg->vgainit1); in do_write_regs()
386 tdfx_outl(par, MISCINIT0, reg->miscinit0); in do_write_regs()
389 tdfx_outl(par, SRCBASE, reg->startaddr); in do_write_regs()
390 tdfx_outl(par, DSTBASE, reg->startaddr); in do_write_regs()
432 /* ------------------------------------------------------------------------- */
436 struct tdfx_par *par = info->par; in tdfxfb_check_var()
439 if (var->bits_per_pixel != 8 && var->bits_per_pixel != 16 && in tdfxfb_check_var()
440 var->bits_per_pixel != 24 && var->bits_per_pixel != 32) { in tdfxfb_check_var()
441 DPRINTK("depth not supported: %u\n", var->bits_per_pixel); in tdfxfb_check_var()
442 return -EINVAL; in tdfxfb_check_var()
445 if (var->xres != var->xres_virtual) in tdfxfb_check_var()
446 var->xres_virtual = var->xres; in tdfxfb_check_var()
448 if (var->yres > var->yres_virtual) in tdfxfb_check_var()
449 var->yres_virtual = var->yres; in tdfxfb_check_var()
451 if (var->xoffset) { in tdfxfb_check_var()
453 return -EINVAL; in tdfxfb_check_var()
455 var->yoffset = 0; in tdfxfb_check_var()
463 if (((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) && in tdfxfb_check_var()
464 (par->max_pixclock < VOODOO3_MAX_PIXCLOCK)) { in tdfxfb_check_var()
466 return -EINVAL; in tdfxfb_check_var()
469 if (info->monspecs.hfmax && info->monspecs.vfmax && in tdfxfb_check_var()
470 info->monspecs.dclkmax && fb_validate_mode(var, info) < 0) { in tdfxfb_check_var()
472 return -EINVAL; in tdfxfb_check_var()
475 var->xres = (var->xres + 15) & ~15; /* could sometimes be 8 */ in tdfxfb_check_var()
476 lpitch = var->xres * ((var->bits_per_pixel + 7) >> 3); in tdfxfb_check_var()
478 if (var->xres < 320 || var->xres > 2048) { in tdfxfb_check_var()
479 DPRINTK("width not supported: %u\n", var->xres); in tdfxfb_check_var()
480 return -EINVAL; in tdfxfb_check_var()
483 if (var->yres < 200 || var->yres > 2048) { in tdfxfb_check_var()
484 DPRINTK("height not supported: %u\n", var->yres); in tdfxfb_check_var()
485 return -EINVAL; in tdfxfb_check_var()
488 if (lpitch * var->yres_virtual > info->fix.smem_len) { in tdfxfb_check_var()
489 var->yres_virtual = info->fix.smem_len / lpitch; in tdfxfb_check_var()
490 if (var->yres_virtual < var->yres) { in tdfxfb_check_var()
492 var->xres, var->yres_virtual, in tdfxfb_check_var()
493 var->bits_per_pixel); in tdfxfb_check_var()
494 return -EINVAL; in tdfxfb_check_var()
498 if (PICOS2KHZ(var->pixclock) > par->max_pixclock) { in tdfxfb_check_var()
500 PICOS2KHZ(var->pixclock)); in tdfxfb_check_var()
501 return -EINVAL; in tdfxfb_check_var()
504 var->transp.offset = 0; in tdfxfb_check_var()
505 var->transp.length = 0; in tdfxfb_check_var()
506 switch (var->bits_per_pixel) { in tdfxfb_check_var()
508 var->red.length = 8; in tdfxfb_check_var()
509 var->red.offset = 0; in tdfxfb_check_var()
510 var->green = var->red; in tdfxfb_check_var()
511 var->blue = var->red; in tdfxfb_check_var()
514 var->red.offset = 11; in tdfxfb_check_var()
515 var->red.length = 5; in tdfxfb_check_var()
516 var->green.offset = 5; in tdfxfb_check_var()
517 var->green.length = 6; in tdfxfb_check_var()
518 var->blue.offset = 0; in tdfxfb_check_var()
519 var->blue.length = 5; in tdfxfb_check_var()
522 var->transp.offset = 24; in tdfxfb_check_var()
523 var->transp.length = 8; in tdfxfb_check_var()
526 var->red.offset = 16; in tdfxfb_check_var()
527 var->green.offset = 8; in tdfxfb_check_var()
528 var->blue.offset = 0; in tdfxfb_check_var()
529 var->red.length = var->green.length = var->blue.length = 8; in tdfxfb_check_var()
532 var->width = -1; in tdfxfb_check_var()
533 var->height = -1; in tdfxfb_check_var()
535 var->accel_flags = FB_ACCELF_TEXT; in tdfxfb_check_var()
538 var->xres, var->yres, var->bits_per_pixel); in tdfxfb_check_var()
544 struct tdfx_par *par = info->par; in tdfxfb_set_par()
545 u32 hdispend = info->var.xres; in tdfxfb_set_par()
546 u32 hsyncsta = hdispend + info->var.right_margin; in tdfxfb_set_par()
547 u32 hsyncend = hsyncsta + info->var.hsync_len; in tdfxfb_set_par()
548 u32 htotal = hsyncend + info->var.left_margin; in tdfxfb_set_par()
554 u32 cpp = (info->var.bits_per_pixel + 7) >> 3; in tdfxfb_set_par()
560 ((cpp - 1) << VIDCFG_PIXFMT_SHIFT) | in tdfxfb_set_par()
564 freq = PICOS2KHZ(info->var.pixclock); in tdfxfb_set_par()
568 if (freq > par->max_pixclock / 2) { in tdfxfb_set_par()
569 freq = freq > par->max_pixclock ? par->max_pixclock : freq; in tdfxfb_set_par()
578 wd = (hdispend >> 3) - 1; in tdfxfb_set_par()
580 hs = (hsyncsta >> 3) - 1; in tdfxfb_set_par()
581 he = (hsyncend >> 3) - 1; in tdfxfb_set_par()
582 ht = (htotal >> 3) - 1; in tdfxfb_set_par()
586 if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) { in tdfxfb_set_par()
587 vd = (info->var.yres << 1) - 1; in tdfxfb_set_par()
588 vs = vd + (info->var.lower_margin << 1); in tdfxfb_set_par()
589 ve = vs + (info->var.vsync_len << 1); in tdfxfb_set_par()
590 vt = ve + (info->var.upper_margin << 1) - 1; in tdfxfb_set_par()
591 reg.screensize = info->var.xres | (info->var.yres << 13); in tdfxfb_set_par()
595 vd = info->var.yres - 1; in tdfxfb_set_par()
596 vs = vd + info->var.lower_margin; in tdfxfb_set_par()
597 ve = vs + info->var.vsync_len; in tdfxfb_set_par()
598 vt = ve + info->var.upper_margin - 1; in tdfxfb_set_par()
599 reg.screensize = info->var.xres | (info->var.yres << 12); in tdfxfb_set_par()
607 (info->var.xres < 400 ? 0xa0 : in tdfxfb_set_par()
608 info->var.xres < 480 ? 0x60 : in tdfxfb_set_par()
609 info->var.xres < 768 ? 0xe0 : 0x20); in tdfxfb_set_par()
641 reg.crt[0x00] = ht - 4; in tdfxfb_set_par()
685 reg.curspataddr = info->fix.smem_len; in tdfxfb_set_par()
692 reg.stride = info->var.xres * cpp; in tdfxfb_set_par()
693 reg.startaddr = info->var.yoffset * reg.stride in tdfxfb_set_par()
694 + info->var.xoffset * cpp; in tdfxfb_set_par()
702 if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) in tdfxfb_set_par()
707 switch (info->var.bits_per_pixel) { in tdfxfb_set_par()
726 info->fix.line_length = reg.stride; in tdfxfb_set_par()
727 info->fix.visual = (info->var.bits_per_pixel == 8) in tdfxfb_set_par()
731 info->var.xres, info->var.yres, info->var.bits_per_pixel); in tdfxfb_set_par()
736 #define CNVT_TOHW(val, width) ((((val) << (width)) + 0x7FFF - (val)) >> 16)
742 struct tdfx_par *par = info->par; in tdfxfb_setcolreg()
745 if (regno >= info->cmap.len || regno > 255) in tdfxfb_setcolreg()
749 if (info->var.grayscale) { in tdfxfb_setcolreg()
756 switch (info->fix.visual) { in tdfxfb_setcolreg()
766 rgbcol = (CNVT_TOHW(red, info->var.red.length) << in tdfxfb_setcolreg()
767 info->var.red.offset) | in tdfxfb_setcolreg()
768 (CNVT_TOHW(green, info->var.green.length) << in tdfxfb_setcolreg()
769 info->var.green.offset) | in tdfxfb_setcolreg()
770 (CNVT_TOHW(blue, info->var.blue.length) << in tdfxfb_setcolreg()
771 info->var.blue.offset) | in tdfxfb_setcolreg()
772 (CNVT_TOHW(transp, info->var.transp.length) << in tdfxfb_setcolreg()
773 info->var.transp.offset); in tdfxfb_setcolreg()
774 par->palette[regno] = rgbcol; in tdfxfb_setcolreg()
779 DPRINTK("bad depth %u\n", info->var.bits_per_pixel); in tdfxfb_setcolreg()
789 struct tdfx_par *par = info->par; in tdfxfb_blank()
822 * Set the starting position of the visible screen to var->yoffset
827 struct tdfx_par *par = info->par; in tdfxfb_pan_display()
828 u32 addr = var->yoffset * info->fix.line_length; in tdfxfb_pan_display()
830 if (nopan || var->xoffset) in tdfxfb_pan_display()
831 return -EINVAL; in tdfxfb_pan_display()
846 struct tdfx_par *par = info->par; in tdfxfb_fillrect()
847 u32 bpp = info->var.bits_per_pixel; in tdfxfb_fillrect()
848 u32 stride = info->fix.line_length; in tdfxfb_fillrect()
851 u32 dx = rect->dx; in tdfxfb_fillrect()
852 u32 dy = rect->dy; in tdfxfb_fillrect()
855 if (rect->rop == ROP_COPY) in tdfxfb_fillrect()
860 /* assume always rect->height < 4096 */ in tdfxfb_fillrect()
861 if (dy + rect->height > 4095) { in tdfxfb_fillrect()
865 /* assume always rect->width < 4096 */ in tdfxfb_fillrect()
866 if (dx + rect->width > 4095) { in tdfxfb_fillrect()
872 if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR) { in tdfxfb_fillrect()
873 tdfx_outl(par, COLORFORE, rect->color); in tdfxfb_fillrect()
875 tdfx_outl(par, COLORFORE, par->palette[rect->color]); in tdfxfb_fillrect()
879 tdfx_outl(par, DSTSIZE, rect->width | (rect->height << 16)); in tdfxfb_fillrect()
884 * Screen-to-Screen BitBlt 2D command (for the bmove fb op.)
889 struct tdfx_par *par = info->par; in tdfxfb_copyarea()
890 u32 sx = area->sx, sy = area->sy, dx = area->dx, dy = area->dy; in tdfxfb_copyarea()
891 u32 bpp = info->var.bits_per_pixel; in tdfxfb_copyarea()
892 u32 stride = info->fix.line_length; in tdfxfb_copyarea()
898 /* assume always area->height < 4096 */ in tdfxfb_copyarea()
899 if (sy + area->height > 4095) { in tdfxfb_copyarea()
903 /* assume always area->width < 4096 */ in tdfxfb_copyarea()
904 if (sx + area->width > 4095) { in tdfxfb_copyarea()
908 /* assume always area->height < 4096 */ in tdfxfb_copyarea()
909 if (dy + area->height > 4095) { in tdfxfb_copyarea()
913 /* assume always area->width < 4096 */ in tdfxfb_copyarea()
914 if (dx + area->width > 4095) { in tdfxfb_copyarea()
919 if (area->sx <= area->dx) { in tdfxfb_copyarea()
920 /* -X */ in tdfxfb_copyarea()
922 sx += area->width - 1; in tdfxfb_copyarea()
923 dx += area->width - 1; in tdfxfb_copyarea()
925 if (area->sy <= area->dy) { in tdfxfb_copyarea()
926 /* -Y */ in tdfxfb_copyarea()
928 sy += area->height - 1; in tdfxfb_copyarea()
929 dy += area->height - 1; in tdfxfb_copyarea()
937 tdfx_outl(par, DSTSIZE, area->width | (area->height << 16)); in tdfxfb_copyarea()
946 struct tdfx_par *par = info->par; in tdfxfb_imageblit()
947 int size = image->height * ((image->width * image->depth + 7) >> 3); in tdfxfb_imageblit()
949 int i, stride = info->fix.line_length; in tdfxfb_imageblit()
950 u32 bpp = info->var.bits_per_pixel; in tdfxfb_imageblit()
952 u8 *chardata = (u8 *) image->data; in tdfxfb_imageblit()
954 u32 dx = image->dx; in tdfxfb_imageblit()
955 u32 dy = image->dy; in tdfxfb_imageblit()
958 if (image->depth != 1) { in tdfxfb_imageblit()
969 switch (info->fix.visual) { in tdfxfb_imageblit()
971 tdfx_outl(par, COLORFORE, image->fg_color); in tdfxfb_imageblit()
972 tdfx_outl(par, COLORBACK, image->bg_color); in tdfxfb_imageblit()
977 par->palette[image->fg_color]); in tdfxfb_imageblit()
979 par->palette[image->bg_color]); in tdfxfb_imageblit()
986 /* assume always image->height < 4096 */ in tdfxfb_imageblit()
987 if (dy + image->height > 4095) { in tdfxfb_imageblit()
991 /* assume always image->width < 4096 */ in tdfxfb_imageblit()
992 if (dx + image->width > 4095) { in tdfxfb_imageblit()
1004 tdfx_outl(par, DSTSIZE, image->width | (image->height << 16)); in tdfxfb_imageblit()
1011 for (i = (size >> 2); i > 0; i--) { in tdfxfb_imageblit()
1012 if (--fifo_free < 0) { in tdfxfb_imageblit()
1041 struct tdfx_par *par = info->par; in tdfxfb_cursor()
1045 return -EINVAL; /* just to force soft_cursor() call */ in tdfxfb_cursor()
1047 /* Too large of a cursor or wrong bpp :-( */ in tdfxfb_cursor()
1048 if (cursor->image.width > 64 || in tdfxfb_cursor()
1049 cursor->image.height > 64 || in tdfxfb_cursor()
1050 cursor->image.depth > 1) in tdfxfb_cursor()
1051 return -EINVAL; in tdfxfb_cursor()
1054 if (cursor->enable) in tdfxfb_cursor()
1064 if (!cursor->set) in tdfxfb_cursor()
1067 /* fix cursor color - XFree86 forgets to restore it properly */ in tdfxfb_cursor()
1068 if (cursor->set & FB_CUR_SETCMAP) { in tdfxfb_cursor()
1069 struct fb_cmap cmap = info->cmap; in tdfxfb_cursor()
1070 u32 bg_idx = cursor->image.bg_color; in tdfxfb_cursor()
1071 u32 fg_idx = cursor->image.fg_color; in tdfxfb_cursor()
1085 if (cursor->set & FB_CUR_SETPOS) { in tdfxfb_cursor()
1086 int x = cursor->image.dx; in tdfxfb_cursor()
1087 int y = cursor->image.dy - info->var.yoffset; in tdfxfb_cursor()
1094 if (cursor->set & (FB_CUR_SETIMAGE | FB_CUR_SETSHAPE)) { in tdfxfb_cursor()
1113 u8 __iomem *cursorbase = info->screen_base + info->fix.smem_len; in tdfxfb_cursor()
1114 u8 *bitmap = (u8 *)cursor->image.data; in tdfxfb_cursor()
1115 u8 *mask = (u8 *)cursor->mask; in tdfxfb_cursor()
1120 for (i = 0; i < cursor->image.height; i++) { in tdfxfb_cursor()
1122 int j = (cursor->image.width + 7) >> 3; in tdfxfb_cursor()
1124 for (; j > 0; j--) { in tdfxfb_cursor()
1126 if (cursor->rop == ROP_COPY) in tdfxfb_cursor()
1169 struct tdfx_par *par = chan->par; in tdfxfb_i2c_setscl()
1184 struct tdfx_par *par = chan->par; in tdfxfb_i2c_setsda()
1197 We rely on the i2c-algo-bit routines to set the pins high before
1203 struct tdfx_par *par = chan->par; in tdfxfb_i2c_getscl()
1211 struct tdfx_par *par = chan->par; in tdfxfb_i2c_getsda()
1219 struct tdfx_par *par = chan->par; in tdfxfb_ddc_setscl()
1234 struct tdfx_par *par = chan->par; in tdfxfb_ddc_setsda()
1249 struct tdfx_par *par = chan->par; in tdfxfb_ddc_getscl()
1257 struct tdfx_par *par = chan->par; in tdfxfb_ddc_getsda()
1267 strlcpy(chan->adapter.name, name, sizeof(chan->adapter.name)); in tdfxfb_setup_ddc_bus()
1268 chan->adapter.owner = THIS_MODULE; in tdfxfb_setup_ddc_bus()
1269 chan->adapter.class = I2C_CLASS_DDC; in tdfxfb_setup_ddc_bus()
1270 chan->adapter.algo_data = &chan->algo; in tdfxfb_setup_ddc_bus()
1271 chan->adapter.dev.parent = dev; in tdfxfb_setup_ddc_bus()
1272 chan->algo.setsda = tdfxfb_ddc_setsda; in tdfxfb_setup_ddc_bus()
1273 chan->algo.setscl = tdfxfb_ddc_setscl; in tdfxfb_setup_ddc_bus()
1274 chan->algo.getsda = tdfxfb_ddc_getsda; in tdfxfb_setup_ddc_bus()
1275 chan->algo.getscl = tdfxfb_ddc_getscl; in tdfxfb_setup_ddc_bus()
1276 chan->algo.udelay = 10; in tdfxfb_setup_ddc_bus()
1277 chan->algo.timeout = msecs_to_jiffies(500); in tdfxfb_setup_ddc_bus()
1278 chan->algo.data = chan; in tdfxfb_setup_ddc_bus()
1280 i2c_set_adapdata(&chan->adapter, chan); in tdfxfb_setup_ddc_bus()
1282 rc = i2c_bit_add_bus(&chan->adapter); in tdfxfb_setup_ddc_bus()
1286 chan->par = NULL; in tdfxfb_setup_ddc_bus()
1296 strlcpy(chan->adapter.name, name, sizeof(chan->adapter.name)); in tdfxfb_setup_i2c_bus()
1297 chan->adapter.owner = THIS_MODULE; in tdfxfb_setup_i2c_bus()
1298 chan->adapter.algo_data = &chan->algo; in tdfxfb_setup_i2c_bus()
1299 chan->adapter.dev.parent = dev; in tdfxfb_setup_i2c_bus()
1300 chan->algo.setsda = tdfxfb_i2c_setsda; in tdfxfb_setup_i2c_bus()
1301 chan->algo.setscl = tdfxfb_i2c_setscl; in tdfxfb_setup_i2c_bus()
1302 chan->algo.getsda = tdfxfb_i2c_getsda; in tdfxfb_setup_i2c_bus()
1303 chan->algo.getscl = tdfxfb_i2c_getscl; in tdfxfb_setup_i2c_bus()
1304 chan->algo.udelay = 10; in tdfxfb_setup_i2c_bus()
1305 chan->algo.timeout = msecs_to_jiffies(500); in tdfxfb_setup_i2c_bus()
1306 chan->algo.data = chan; in tdfxfb_setup_i2c_bus()
1308 i2c_set_adapdata(&chan->adapter, chan); in tdfxfb_setup_i2c_bus()
1310 rc = i2c_bit_add_bus(&chan->adapter); in tdfxfb_setup_i2c_bus()
1314 chan->par = NULL; in tdfxfb_setup_i2c_bus()
1321 struct tdfx_par *par = info->par; in tdfxfb_create_i2c_busses()
1326 par->chan[0].par = par; in tdfxfb_create_i2c_busses()
1327 par->chan[1].par = par; in tdfxfb_create_i2c_busses()
1329 tdfxfb_setup_ddc_bus(&par->chan[0], "Voodoo3-DDC", info->dev); in tdfxfb_create_i2c_busses()
1330 tdfxfb_setup_i2c_bus(&par->chan[1], "Voodoo3-I2C", info->dev); in tdfxfb_create_i2c_busses()
1335 if (par->chan[0].par) in tdfxfb_delete_i2c_busses()
1336 i2c_del_adapter(&par->chan[0].adapter); in tdfxfb_delete_i2c_busses()
1337 par->chan[0].par = NULL; in tdfxfb_delete_i2c_busses()
1339 if (par->chan[1].par) in tdfxfb_delete_i2c_busses()
1340 i2c_del_adapter(&par->chan[1].adapter); in tdfxfb_delete_i2c_busses()
1341 par->chan[1].par = NULL; in tdfxfb_delete_i2c_busses()
1350 if (par->chan[0].par) in tdfxfb_probe_i2c_connector()
1351 edid = fb_ddc_read(&par->chan[0].adapter); in tdfxfb_probe_i2c_connector()
1363 * tdfxfb_probe - Device Initializiation
1385 info = framebuffer_alloc(sizeof(struct tdfx_par), &pdev->dev); in tdfxfb_probe()
1388 return -ENOMEM; in tdfxfb_probe()
1390 default_par = info->par; in tdfxfb_probe()
1391 info->fix = tdfx_fix; in tdfxfb_probe()
1394 switch (pdev->device) { in tdfxfb_probe()
1396 strcpy(info->fix.id, "3Dfx Banshee"); in tdfxfb_probe()
1397 default_par->max_pixclock = BANSHEE_MAX_PIXCLOCK; in tdfxfb_probe()
1400 strcpy(info->fix.id, "3Dfx Voodoo3"); in tdfxfb_probe()
1401 default_par->max_pixclock = VOODOO3_MAX_PIXCLOCK; in tdfxfb_probe()
1404 strcpy(info->fix.id, "3Dfx Voodoo5"); in tdfxfb_probe()
1405 default_par->max_pixclock = VOODOO5_MAX_PIXCLOCK; in tdfxfb_probe()
1409 info->fix.mmio_start = pci_resource_start(pdev, 0); in tdfxfb_probe()
1410 info->fix.mmio_len = pci_resource_len(pdev, 0); in tdfxfb_probe()
1411 if (!request_mem_region(info->fix.mmio_start, info->fix.mmio_len, in tdfxfb_probe()
1417 default_par->regbase_virt = in tdfxfb_probe()
1418 ioremap(info->fix.mmio_start, info->fix.mmio_len); in tdfxfb_probe()
1419 if (!default_par->regbase_virt) { in tdfxfb_probe()
1421 info->fix.id); in tdfxfb_probe()
1425 info->fix.smem_start = pci_resource_start(pdev, 1); in tdfxfb_probe()
1426 info->fix.smem_len = do_lfb_size(default_par, pdev->device); in tdfxfb_probe()
1427 if (!info->fix.smem_len) { in tdfxfb_probe()
1428 printk(KERN_ERR "fb: Can't count %s memory.\n", info->fix.id); in tdfxfb_probe()
1432 if (!request_mem_region(info->fix.smem_start, in tdfxfb_probe()
1433 pci_resource_len(pdev, 1), "tdfx smem")) { in tdfxfb_probe()
1434 printk(KERN_ERR "tdfxfb: Can't reserve smem\n"); in tdfxfb_probe()
1438 info->screen_base = ioremap_wc(info->fix.smem_start, in tdfxfb_probe()
1439 info->fix.smem_len); in tdfxfb_probe()
1440 if (!info->screen_base) { in tdfxfb_probe()
1442 info->fix.id); in tdfxfb_probe()
1446 default_par->iobase = pci_resource_start(pdev, 2); in tdfxfb_probe()
1454 printk(KERN_INFO "fb: %s memory = %dK\n", info->fix.id, in tdfxfb_probe()
1455 info->fix.smem_len >> 10); in tdfxfb_probe()
1458 default_par->wc_cookie= arch_phys_wc_add(info->fix.smem_start, in tdfxfb_probe()
1459 info->fix.smem_len); in tdfxfb_probe()
1461 info->fix.ypanstep = nopan ? 0 : 1; in tdfxfb_probe()
1462 info->fix.ywrapstep = nowrap ? 0 : 1; in tdfxfb_probe()
1464 info->fbops = &tdfxfb_ops; in tdfxfb_probe()
1465 info->pseudo_palette = default_par->palette; in tdfxfb_probe()
1466 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; in tdfxfb_probe()
1468 info->flags |= FBINFO_HWACCEL_FILLRECT | in tdfxfb_probe()
1476 info->fix.smem_len = (info->fix.smem_len - 1024) & in tdfxfb_probe()
1478 specs = &info->monspecs; in tdfxfb_probe()
1480 info->var.bits_per_pixel = 8; in tdfxfb_probe()
1486 if (specs->modedb == NULL) in tdfxfb_probe()
1491 fb_videomode_to_modelist(specs->modedb, in tdfxfb_probe()
1492 specs->modedb_len, in tdfxfb_probe()
1493 &info->modelist); in tdfxfb_probe()
1494 m = fb_find_best_display(specs, &info->modelist); in tdfxfb_probe()
1496 fb_videomode_to_var(&info->var, m); in tdfxfb_probe()
1497 /* fill all other info->var's fields */ in tdfxfb_probe()
1498 if (tdfxfb_check_var(&info->var, info) < 0) in tdfxfb_probe()
1499 info->var = tdfx_var; in tdfxfb_probe()
1510 err = fb_find_mode(&info->var, info, mode_option, in tdfxfb_probe()
1511 specs->modedb, specs->modedb_len, in tdfxfb_probe()
1512 NULL, info->var.bits_per_pixel); in tdfxfb_probe()
1514 info->var = tdfx_var; in tdfxfb_probe()
1518 fb_destroy_modedb(specs->modedb); in tdfxfb_probe()
1519 specs->modedb = NULL; in tdfxfb_probe()
1523 lpitch = info->var.xres_virtual * ((info->var.bits_per_pixel + 7) >> 3); in tdfxfb_probe()
1524 info->var.yres_virtual = info->fix.smem_len / lpitch; in tdfxfb_probe()
1525 if (info->var.yres_virtual < info->var.yres) in tdfxfb_probe()
1528 if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) { in tdfxfb_probe()
1535 fb_dealloc_cmap(&info->cmap); in tdfxfb_probe()
1548 arch_phys_wc_del(default_par->wc_cookie); in tdfxfb_probe()
1552 if (info->screen_base) in tdfxfb_probe()
1553 iounmap(info->screen_base); in tdfxfb_probe()
1554 release_mem_region(info->fix.smem_start, pci_resource_len(pdev, 1)); in tdfxfb_probe()
1559 if (default_par->regbase_virt) in tdfxfb_probe()
1560 iounmap(default_par->regbase_virt); in tdfxfb_probe()
1561 release_mem_region(info->fix.mmio_start, info->fix.mmio_len); in tdfxfb_probe()
1564 return -ENXIO; in tdfxfb_probe()
1594 * tdfxfb_remove - Device removal
1605 struct tdfx_par *par = info->par; in tdfxfb_remove()
1611 arch_phys_wc_del(par->wc_cookie); in tdfxfb_remove()
1612 iounmap(par->regbase_virt); in tdfxfb_remove()
1613 iounmap(info->screen_base); in tdfxfb_remove()
1622 fb_dealloc_cmap(&info->cmap); in tdfxfb_remove()
1632 return -ENODEV; in tdfxfb_init()
1652 MODULE_PARM_DESC(mode_option, "Initial video mode e.g. '648x480-8@60'");