Lines Matching +full:reference +full:- +full:div2 +full:- +full:enable

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 1998-2002 Russell King
49 #include <linux/i2c-algo-bit.h>
52 #include <asm/mach-types.h>
109 #define cyber2000fb_writel(val, reg, cfb) writel(val, (cfb)->regs + (reg))
110 #define cyber2000fb_writew(val, reg, cfb) writew(val, (cfb)->regs + (reg))
111 #define cyber2000fb_writeb(val, reg, cfb) writeb(val, (cfb)->regs + (reg))
113 #define cyber2000fb_readb(reg, cfb) readb((cfb)->regs + (reg))
149 /* -------------------- Hardware specific routines ------------------------- */
160 if (!(cfb->fb.var.accel_flags & FB_ACCELF_TEXT)) { in cyber2000fb_fillrect()
166 cyber2000fb_writew(rect->width - 1, CO_REG_PIXWIDTH, cfb); in cyber2000fb_fillrect()
167 cyber2000fb_writew(rect->height - 1, CO_REG_PIXHEIGHT, cfb); in cyber2000fb_fillrect()
169 col = rect->color; in cyber2000fb_fillrect()
170 if (cfb->fb.var.bits_per_pixel > 8) in cyber2000fb_fillrect()
171 col = ((u32 *)cfb->fb.pseudo_palette)[col]; in cyber2000fb_fillrect()
174 dst = rect->dx + rect->dy * cfb->fb.var.xres_virtual; in cyber2000fb_fillrect()
175 if (cfb->fb.var.bits_per_pixel == 24) { in cyber2000fb_fillrect()
193 if (!(cfb->fb.var.accel_flags & FB_ACCELF_TEXT)) { in cyber2000fb_copyarea()
199 cyber2000fb_writew(region->width - 1, CO_REG_PIXWIDTH, cfb); in cyber2000fb_copyarea()
200 cyber2000fb_writew(region->height - 1, CO_REG_PIXHEIGHT, cfb); in cyber2000fb_copyarea()
202 src = region->sx + region->sy * cfb->fb.var.xres_virtual; in cyber2000fb_copyarea()
203 dst = region->dx + region->dy * cfb->fb.var.xres_virtual; in cyber2000fb_copyarea()
205 if (region->sx < region->dx) { in cyber2000fb_copyarea()
206 src += region->width - 1; in cyber2000fb_copyarea()
207 dst += region->width - 1; in cyber2000fb_copyarea()
211 if (region->sy < region->dy) { in cyber2000fb_copyarea()
212 src += (region->height - 1) * cfb->fb.var.xres_virtual; in cyber2000fb_copyarea()
213 dst += (region->height - 1) * cfb->fb.var.xres_virtual; in cyber2000fb_copyarea()
217 if (cfb->fb.var.bits_per_pixel == 24) { in cyber2000fb_copyarea()
235 if (!(cfb->fb.var.accel_flags & FB_ACCELF_TEXT)) in cyber2000fb_sync()
239 if (!count--) { in cyber2000fb_sync()
255 u_int mask = (1 << bf->length) - 1; in convert_bitfield()
257 return (val >> (16 - bf->length) & mask) << bf->offset; in convert_bitfield()
268 struct fb_var_screeninfo *var = &cfb->fb.var; in cyber2000fb_setcolreg()
272 switch (cfb->fb.fix.visual) { in cyber2000fb_setcolreg()
279 * pixel --/--+--/--> red lut --> red dac in cyber2000fb_setcolreg()
281 * +--/--> green lut --> green dac in cyber2000fb_setcolreg()
283 * +--/--> blue lut --> blue dac in cyber2000fb_setcolreg()
293 cfb->palette[regno].red = red; in cyber2000fb_setcolreg()
294 cfb->palette[regno].green = green; in cyber2000fb_setcolreg()
295 cfb->palette[regno].blue = blue; in cyber2000fb_setcolreg()
306 * pixel --/--+--/--> red lut --> red dac in cyber2000fb_setcolreg()
308 * +--/--> green lut --> green dac in cyber2000fb_setcolreg()
310 * +--/--> blue lut --> blue dac in cyber2000fb_setcolreg()
318 if (var->green.length == 6 && regno < 64) { in cyber2000fb_setcolreg()
319 cfb->palette[regno << 2].green = green; in cyber2000fb_setcolreg()
326 cyber2000fb_writeb(cfb->palette[regno >> 1].red, in cyber2000fb_setcolreg()
329 cyber2000fb_writeb(cfb->palette[regno >> 1].blue, in cyber2000fb_setcolreg()
332 green = cfb->palette[regno << 3].green; in cyber2000fb_setcolreg()
337 if (var->green.length >= 5 && regno < 32) { in cyber2000fb_setcolreg()
338 cfb->palette[regno << 3].red = red; in cyber2000fb_setcolreg()
339 cfb->palette[regno << 3].green = green; in cyber2000fb_setcolreg()
340 cfb->palette[regno << 3].blue = blue; in cyber2000fb_setcolreg()
353 if (var->green.length == 4 && regno < 16) { in cyber2000fb_setcolreg()
354 cfb->palette[regno << 4].red = red; in cyber2000fb_setcolreg()
355 cfb->palette[regno << 4].green = green; in cyber2000fb_setcolreg()
356 cfb->palette[regno << 4].blue = blue; in cyber2000fb_setcolreg()
373 pseudo_val = regno << var->red.offset | in cyber2000fb_setcolreg()
374 regno << var->green.offset | in cyber2000fb_setcolreg()
375 regno << var->blue.offset; in cyber2000fb_setcolreg()
381 * pixel --/--+--/--> red dac in cyber2000fb_setcolreg()
383 * +--/--> green dac in cyber2000fb_setcolreg()
385 * +--/--> blue dac in cyber2000fb_setcolreg()
389 pseudo_val = convert_bitfield(transp ^ 0xffff, &var->transp); in cyber2000fb_setcolreg()
390 pseudo_val |= convert_bitfield(red, &var->red); in cyber2000fb_setcolreg()
391 pseudo_val |= convert_bitfield(green, &var->green); in cyber2000fb_setcolreg()
392 pseudo_val |= convert_bitfield(blue, &var->blue); in cyber2000fb_setcolreg()
401 ((u32 *)cfb->fb.pseudo_palette)[regno] = pseudo_val; in cyber2000fb_setcolreg()
435 unsigned int val = cfb->ramdac_ctrl | cfb->ramdac_powerdown; in cyber2000fb_write_ramdac_ctrl()
442 /* prevent card lock-up observed on x86 with CyberPro 2000 */ in cyber2000fb_write_ramdac_ctrl()
472 cyber2000_crtcw(crtc_idx[i], hw->crtc[i], cfb); in cyber2000fb_set_timing()
477 cyber2000_grphw(EXT_CRT_VRTOFL, hw->crtc_ofl, cfb); in cyber2000fb_set_timing()
499 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_set_timing()
500 cyber2000_grphw(EXT_DCLK_MULT, hw->clock_mult, cfb); in cyber2000fb_set_timing()
501 cyber2000_grphw(EXT_DCLK_DIV, hw->clock_div, cfb); in cyber2000fb_set_timing()
502 cyber2000_grphw(EXT_MCLK_MULT, cfb->mclk_mult, cfb); in cyber2000fb_set_timing()
503 cyber2000_grphw(EXT_MCLK_DIV, cfb->mclk_div, cfb); in cyber2000fb_set_timing()
507 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_set_timing()
509 cfb->ramdac_ctrl = hw->ramdac; in cyber2000fb_set_timing()
515 cyber2000_grphw(0x14, hw->fetch, cfb); in cyber2000fb_set_timing()
516 cyber2000_grphw(0x15, ((hw->fetch >> 8) & 0x03) | in cyber2000fb_set_timing()
517 ((hw->pitch >> 4) & 0x30), cfb); in cyber2000fb_set_timing()
518 cyber2000_grphw(EXT_SEQ_MISC, hw->extseqmisc, cfb); in cyber2000fb_set_timing()
523 cyber2000fb_writew(hw->width, CO_REG_SRC_WIDTH, cfb); in cyber2000fb_set_timing()
524 cyber2000fb_writew(hw->width, CO_REG_DEST_WIDTH, cfb); in cyber2000fb_set_timing()
525 cyber2000fb_writeb(hw->co_pixfmt, CO_REG_PIXFMT, cfb); in cyber2000fb_set_timing()
531 u_int base = var->yoffset * var->xres_virtual + var->xoffset; in cyber2000fb_update_start()
533 base *= var->bits_per_pixel; in cyber2000fb_update_start()
542 return -EINVAL; in cyber2000fb_update_start()
559 hw->crtc[13] = hw->pitch; in cyber2000fb_decode_crtc()
560 hw->crtc[17] = 0xe3; in cyber2000fb_decode_crtc()
561 hw->crtc[14] = 0; in cyber2000fb_decode_crtc()
562 hw->crtc[8] = 0; in cyber2000fb_decode_crtc()
564 Htotal = var->xres + var->right_margin + in cyber2000fb_decode_crtc()
565 var->hsync_len + var->left_margin; in cyber2000fb_decode_crtc()
568 return -EINVAL; in cyber2000fb_decode_crtc()
570 hw->crtc[0] = (Htotal >> 3) - 5; in cyber2000fb_decode_crtc()
571 hw->crtc[1] = (var->xres >> 3) - 1; in cyber2000fb_decode_crtc()
572 hw->crtc[2] = var->xres >> 3; in cyber2000fb_decode_crtc()
573 hw->crtc[4] = (var->xres + var->right_margin) >> 3; in cyber2000fb_decode_crtc()
575 Hblankend = (Htotal - 4 * 8) >> 3; in cyber2000fb_decode_crtc()
577 hw->crtc[3] = ENCODE_BIT(Hblankend, 0, 0x1f, 0) | in cyber2000fb_decode_crtc()
580 Hsyncend = (var->xres + var->right_margin + var->hsync_len) >> 3; in cyber2000fb_decode_crtc()
582 hw->crtc[5] = ENCODE_BIT(Hsyncend, 0, 0x1f, 0) | in cyber2000fb_decode_crtc()
585 Vdispend = var->yres - 1; in cyber2000fb_decode_crtc()
586 Vsyncstart = var->yres + var->lower_margin; in cyber2000fb_decode_crtc()
587 Vsyncend = var->yres + var->lower_margin + var->vsync_len; in cyber2000fb_decode_crtc()
588 Vtotal = var->yres + var->lower_margin + var->vsync_len + in cyber2000fb_decode_crtc()
589 var->upper_margin - 2; in cyber2000fb_decode_crtc()
592 return -EINVAL; in cyber2000fb_decode_crtc()
594 Vblankstart = var->yres + 6; in cyber2000fb_decode_crtc()
595 Vblankend = Vtotal - 10; in cyber2000fb_decode_crtc()
597 hw->crtc[6] = Vtotal; in cyber2000fb_decode_crtc()
598 hw->crtc[7] = ENCODE_BIT(Vtotal, 8, 0x01, 0) | in cyber2000fb_decode_crtc()
606 hw->crtc[9] = ENCODE_BIT(0, 0, 0x1f, 0) | in cyber2000fb_decode_crtc()
609 hw->crtc[10] = Vsyncstart; in cyber2000fb_decode_crtc()
610 hw->crtc[11] = ENCODE_BIT(Vsyncend, 0, 0x0f, 0) | in cyber2000fb_decode_crtc()
612 hw->crtc[12] = Vdispend; in cyber2000fb_decode_crtc()
613 hw->crtc[15] = Vblankstart; in cyber2000fb_decode_crtc()
614 hw->crtc[16] = Vblankend; in cyber2000fb_decode_crtc()
615 hw->crtc[18] = 0xff; in cyber2000fb_decode_crtc()
618 * overflow - graphics reg 0x11 in cyber2000fb_decode_crtc()
620 * 4=LINECOMP:10 5-IVIDEO 6=FIXCNT in cyber2000fb_decode_crtc()
622 hw->crtc_ofl = in cyber2000fb_decode_crtc()
631 if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) in cyber2000fb_decode_crtc()
632 hw->crtc_ofl |= EXT_CRT_VRTOFL_INTERLACE; in cyber2000fb_decode_crtc()
642 * fclock = fpll / div2
648 * div2 = 2^(reg0xb1.7:6)
656 u_long pll_ps = var->pixclock; in cyber2000fb_decode_clock()
657 const u_long ref_ps = cfb->ref_ps; in cyber2000fb_decode_clock()
658 u_int div2, t_div1, best_div1, best_mult; in cyber2000fb_decode_clock() local
664 * find div2 such that 115MHz < fpll < 260MHz in cyber2000fb_decode_clock()
665 * and 0 <= div2 < 4 in cyber2000fb_decode_clock()
667 for (div2 = 0; div2 < 4; div2++) { in cyber2000fb_decode_clock()
670 new_pll = pll_ps / cfb->divisors[div2]; in cyber2000fb_decode_clock()
677 if (div2 == 4) in cyber2000fb_decode_clock()
678 return -EINVAL; in cyber2000fb_decode_clock()
711 diff = pll_ps - t_pll_ps; in cyber2000fb_decode_clock()
713 diff = -diff; in cyber2000fb_decode_clock()
732 hw->clock_mult = best_mult - 1; in cyber2000fb_decode_clock()
733 hw->clock_div = div2 << 6 | (best_div1 - 1); in cyber2000fb_decode_clock()
738 hw->clock_div |= EXT_DCLK_DIV_VFSEL; in cyber2000fb_decode_clock()
754 var->transp.msb_right = 0; in cyber2000fb_check_var()
755 var->red.msb_right = 0; in cyber2000fb_check_var()
756 var->green.msb_right = 0; in cyber2000fb_check_var()
757 var->blue.msb_right = 0; in cyber2000fb_check_var()
758 var->transp.offset = 0; in cyber2000fb_check_var()
759 var->transp.length = 0; in cyber2000fb_check_var()
761 switch (var->bits_per_pixel) { in cyber2000fb_check_var()
763 var->red.offset = 0; in cyber2000fb_check_var()
764 var->red.length = 8; in cyber2000fb_check_var()
765 var->green.offset = 0; in cyber2000fb_check_var()
766 var->green.length = 8; in cyber2000fb_check_var()
767 var->blue.offset = 0; in cyber2000fb_check_var()
768 var->blue.length = 8; in cyber2000fb_check_var()
772 switch (var->green.length) { in cyber2000fb_check_var()
774 var->red.offset = 11; in cyber2000fb_check_var()
775 var->red.length = 5; in cyber2000fb_check_var()
776 var->green.offset = 5; in cyber2000fb_check_var()
777 var->green.length = 6; in cyber2000fb_check_var()
778 var->blue.offset = 0; in cyber2000fb_check_var()
779 var->blue.length = 5; in cyber2000fb_check_var()
784 var->red.offset = 10; in cyber2000fb_check_var()
785 var->red.length = 5; in cyber2000fb_check_var()
786 var->green.offset = 5; in cyber2000fb_check_var()
787 var->green.length = 5; in cyber2000fb_check_var()
788 var->blue.offset = 0; in cyber2000fb_check_var()
789 var->blue.length = 5; in cyber2000fb_check_var()
793 var->transp.offset = 12; in cyber2000fb_check_var()
794 var->transp.length = 4; in cyber2000fb_check_var()
795 var->red.offset = 8; in cyber2000fb_check_var()
796 var->red.length = 4; in cyber2000fb_check_var()
797 var->green.offset = 4; in cyber2000fb_check_var()
798 var->green.length = 4; in cyber2000fb_check_var()
799 var->blue.offset = 0; in cyber2000fb_check_var()
800 var->blue.length = 4; in cyber2000fb_check_var()
806 var->red.offset = 16; in cyber2000fb_check_var()
807 var->red.length = 8; in cyber2000fb_check_var()
808 var->green.offset = 8; in cyber2000fb_check_var()
809 var->green.length = 8; in cyber2000fb_check_var()
810 var->blue.offset = 0; in cyber2000fb_check_var()
811 var->blue.length = 8; in cyber2000fb_check_var()
815 var->transp.offset = 24; in cyber2000fb_check_var()
816 var->transp.length = 8; in cyber2000fb_check_var()
817 var->red.offset = 16; in cyber2000fb_check_var()
818 var->red.length = 8; in cyber2000fb_check_var()
819 var->green.offset = 8; in cyber2000fb_check_var()
820 var->green.length = 8; in cyber2000fb_check_var()
821 var->blue.offset = 0; in cyber2000fb_check_var()
822 var->blue.length = 8; in cyber2000fb_check_var()
826 return -EINVAL; in cyber2000fb_check_var()
829 mem = var->xres_virtual * var->yres_virtual * (var->bits_per_pixel / 8); in cyber2000fb_check_var()
830 if (mem > cfb->fb.fix.smem_len) in cyber2000fb_check_var()
831 var->yres_virtual = cfb->fb.fix.smem_len * 8 / in cyber2000fb_check_var()
832 (var->bits_per_pixel * var->xres_virtual); in cyber2000fb_check_var()
834 if (var->yres > var->yres_virtual) in cyber2000fb_check_var()
835 var->yres = var->yres_virtual; in cyber2000fb_check_var()
836 if (var->xres > var->xres_virtual) in cyber2000fb_check_var()
837 var->xres = var->xres_virtual; in cyber2000fb_check_var()
853 struct fb_var_screeninfo *var = &cfb->fb.var; in cyber2000fb_set_par()
857 hw.width = var->xres_virtual; in cyber2000fb_set_par()
860 switch (var->bits_per_pixel) { in cyber2000fb_set_par()
871 switch (var->green.length) { in cyber2000fb_set_par()
919 hw.width -= 1; in cyber2000fb_set_par()
921 if (!(cfb->mem_ctl2 & MEM_CTL2_64BIT)) in cyber2000fb_set_par()
925 cfb->fb.fix.line_length = var->xres_virtual * var->bits_per_pixel / 8; in cyber2000fb_set_par()
928 * Same here - if the size of the video mode exceeds the in cyber2000fb_set_par()
934 mem = cfb->fb.fix.line_length * var->yres_virtual; in cyber2000fb_set_par()
935 BUG_ON(mem > cfb->fb.fix.smem_len); in cyber2000fb_set_par()
943 if (var->bits_per_pixel == 8) in cyber2000fb_set_par()
944 cfb->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR; in cyber2000fb_set_par()
946 cfb->fb.fix.visual = FB_VISUAL_TRUECOLOR; in cyber2000fb_set_par()
948 cfb->fb.fix.visual = FB_VISUAL_DIRECTCOLOR; in cyber2000fb_set_par()
965 return -EINVAL; in cyber2000fb_pan_display()
967 cfb->fb.var.xoffset = var->xoffset; in cyber2000fb_pan_display()
968 cfb->fb.var.yoffset = var->yoffset; in cyber2000fb_pan_display()
970 if (var->vmode & FB_VMODE_YWRAP) { in cyber2000fb_pan_display()
971 cfb->fb.var.vmode |= FB_VMODE_YWRAP; in cyber2000fb_pan_display()
973 cfb->fb.var.vmode &= ~FB_VMODE_YWRAP; in cyber2000fb_pan_display()
985 * succeeded, != 0 if un-/blanking failed due to e.g. a
993 * wms...Enable VESA DMPS compatible powerdown mode
994 * run "setterm -powersave powerdown" to take advantage
1003 case FB_BLANK_POWERDOWN: /* powerdown - both sync lines down */ in cyber2000fb_blank()
1021 cfb->ramdac_powerdown &= ~(RAMDAC_DACPWRDN | RAMDAC_BYPASS | in cyber2000fb_blank()
1039 cyber2000fb_writeb(cfb->palette[i].red, 0x3c9, cfb); in cyber2000fb_blank()
1040 cyber2000fb_writeb(cfb->palette[i].green, 0x3c9, cfb); in cyber2000fb_blank()
1041 cyber2000fb_writeb(cfb->palette[i].blue, 0x3c9, cfb); in cyber2000fb_blank()
1047 cfb->ramdac_powerdown |= RAMDAC_DACPWRDN | RAMDAC_BYPASS | in cyber2000fb_blank()
1071 * This is the only "static" reference to the internal data structures
1078 * Enable access to the extended registers
1082 cfb->func_use_count += 1; in cyber2000fb_enable_extregs()
1084 if (cfb->func_use_count == 1) { in cyber2000fb_enable_extregs()
1099 if (cfb->func_use_count == 1) { in cyber2000fb_disable_extregs()
1107 if (cfb->func_use_count == 0) in cyber2000fb_disable_extregs()
1110 cfb->func_use_count -= 1; in cyber2000fb_disable_extregs()
1120 info->dev = int_cfb_info->fb.device; in cyber2000fb_attach()
1122 info->i2c = &int_cfb_info->i2c_adapter; in cyber2000fb_attach()
1124 info->i2c = NULL; in cyber2000fb_attach()
1126 info->regs = int_cfb_info->regs; in cyber2000fb_attach()
1127 info->irq = int_cfb_info->irq; in cyber2000fb_attach()
1128 info->fb = int_cfb_info->fb.screen_base; in cyber2000fb_attach()
1129 info->fb_size = int_cfb_info->fb.fix.smem_len; in cyber2000fb_attach()
1130 info->info = int_cfb_info; in cyber2000fb_attach()
1132 strscpy(info->dev_name, int_cfb_info->fb.fix.id, in cyber2000fb_attach()
1133 sizeof(info->dev_name)); in cyber2000fb_attach()
1157 __acquires(&cfb->reg_b0_lock) in cyber2000fb_enable_ddc()
1159 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_enable_ddc()
1164 __releases(&cfb->reg_b0_lock) in cyber2000fb_disable_ddc()
1167 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_disable_ddc()
1227 strscpy(cfb->ddc_adapter.name, cfb->fb.fix.id, in cyber2000fb_setup_ddc_bus()
1228 sizeof(cfb->ddc_adapter.name)); in cyber2000fb_setup_ddc_bus()
1229 cfb->ddc_adapter.owner = THIS_MODULE; in cyber2000fb_setup_ddc_bus()
1230 cfb->ddc_adapter.algo_data = &cfb->ddc_algo; in cyber2000fb_setup_ddc_bus()
1231 cfb->ddc_adapter.dev.parent = cfb->fb.device; in cyber2000fb_setup_ddc_bus()
1232 cfb->ddc_algo.setsda = cyber2000fb_ddc_setsda; in cyber2000fb_setup_ddc_bus()
1233 cfb->ddc_algo.setscl = cyber2000fb_ddc_setscl; in cyber2000fb_setup_ddc_bus()
1234 cfb->ddc_algo.getsda = cyber2000fb_ddc_getsda; in cyber2000fb_setup_ddc_bus()
1235 cfb->ddc_algo.getscl = cyber2000fb_ddc_getscl; in cyber2000fb_setup_ddc_bus()
1236 cfb->ddc_algo.udelay = 10; in cyber2000fb_setup_ddc_bus()
1237 cfb->ddc_algo.timeout = 20; in cyber2000fb_setup_ddc_bus()
1238 cfb->ddc_algo.data = cfb; in cyber2000fb_setup_ddc_bus()
1240 i2c_set_adapdata(&cfb->ddc_adapter, cfb); in cyber2000fb_setup_ddc_bus()
1242 return i2c_bit_add_bus(&cfb->ddc_adapter); in cyber2000fb_setup_ddc_bus()
1252 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_i2c_setsda()
1258 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_i2c_setsda()
1266 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_i2c_setscl()
1272 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_i2c_setscl()
1280 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_i2c_getsda()
1282 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_i2c_getsda()
1292 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_i2c_getscl()
1294 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_i2c_getscl()
1301 strscpy(cfb->i2c_adapter.name, cfb->fb.fix.id, in cyber2000fb_i2c_register()
1302 sizeof(cfb->i2c_adapter.name)); in cyber2000fb_i2c_register()
1303 cfb->i2c_adapter.owner = THIS_MODULE; in cyber2000fb_i2c_register()
1304 cfb->i2c_adapter.algo_data = &cfb->i2c_algo; in cyber2000fb_i2c_register()
1305 cfb->i2c_adapter.dev.parent = cfb->fb.device; in cyber2000fb_i2c_register()
1306 cfb->i2c_algo.setsda = cyber2000fb_i2c_setsda; in cyber2000fb_i2c_register()
1307 cfb->i2c_algo.setscl = cyber2000fb_i2c_setscl; in cyber2000fb_i2c_register()
1308 cfb->i2c_algo.getsda = cyber2000fb_i2c_getsda; in cyber2000fb_i2c_register()
1309 cfb->i2c_algo.getscl = cyber2000fb_i2c_getscl; in cyber2000fb_i2c_register()
1310 cfb->i2c_algo.udelay = 5; in cyber2000fb_i2c_register()
1311 cfb->i2c_algo.timeout = msecs_to_jiffies(100); in cyber2000fb_i2c_register()
1312 cfb->i2c_algo.data = cfb; in cyber2000fb_i2c_register()
1314 return i2c_bit_add_bus(&cfb->i2c_adapter); in cyber2000fb_i2c_register()
1319 i2c_del_adapter(&cfb->i2c_adapter); in cyber2000fb_i2c_unregister()
1390 if (cfb->id == ID_CYBERPRO_5000) { in cyberpro_init_hw()
1407 cfb->id = id; in cyberpro_alloc_fb_info()
1410 cfb->ref_ps = 40690; /* 24.576 MHz */ in cyberpro_alloc_fb_info()
1412 cfb->ref_ps = 69842; /* 14.31818 MHz (69841?) */ in cyberpro_alloc_fb_info()
1414 cfb->divisors[0] = 1; in cyberpro_alloc_fb_info()
1415 cfb->divisors[1] = 2; in cyberpro_alloc_fb_info()
1416 cfb->divisors[2] = 4; in cyberpro_alloc_fb_info()
1419 cfb->divisors[3] = 8; in cyberpro_alloc_fb_info()
1421 cfb->divisors[3] = 6; in cyberpro_alloc_fb_info()
1423 strcpy(cfb->fb.fix.id, name); in cyberpro_alloc_fb_info()
1425 cfb->fb.fix.type = FB_TYPE_PACKED_PIXELS; in cyberpro_alloc_fb_info()
1426 cfb->fb.fix.type_aux = 0; in cyberpro_alloc_fb_info()
1427 cfb->fb.fix.xpanstep = 0; in cyberpro_alloc_fb_info()
1428 cfb->fb.fix.ypanstep = 1; in cyberpro_alloc_fb_info()
1429 cfb->fb.fix.ywrapstep = 0; in cyberpro_alloc_fb_info()
1433 cfb->fb.fix.accel = 0; in cyberpro_alloc_fb_info()
1437 cfb->fb.fix.accel = FB_ACCEL_IGS_CYBER2000; in cyberpro_alloc_fb_info()
1441 cfb->fb.fix.accel = FB_ACCEL_IGS_CYBER2010; in cyberpro_alloc_fb_info()
1445 cfb->fb.fix.accel = FB_ACCEL_IGS_CYBER5000; in cyberpro_alloc_fb_info()
1449 cfb->fb.var.nonstd = 0; in cyberpro_alloc_fb_info()
1450 cfb->fb.var.activate = FB_ACTIVATE_NOW; in cyberpro_alloc_fb_info()
1451 cfb->fb.var.height = -1; in cyberpro_alloc_fb_info()
1452 cfb->fb.var.width = -1; in cyberpro_alloc_fb_info()
1453 cfb->fb.var.accel_flags = FB_ACCELF_TEXT; in cyberpro_alloc_fb_info()
1455 cfb->fb.fbops = &cyber2000fb_ops; in cyberpro_alloc_fb_info()
1456 cfb->fb.flags = FBINFO_HWACCEL_YPAN; in cyberpro_alloc_fb_info()
1457 cfb->fb.pseudo_palette = cfb->pseudo_palette; in cyberpro_alloc_fb_info()
1459 spin_lock_init(&cfb->reg_b0_lock); in cyberpro_alloc_fb_info()
1461 fb_alloc_cmap(&cfb->fb.cmap, NR_PALETTE, 0); in cyberpro_alloc_fb_info()
1472 fb_alloc_cmap(&cfb->fb.cmap, 0, 0); in cyberpro_free_fb_info()
1511 * This probe function is common to all bus types. The bus-specific
1513 * - enabled access to the linear memory region
1514 * - memory mapped access to the registers
1515 * - initialised mem_ctl1 and mem_ctl2 appropriately.
1530 cfb->mem_ctl1 = cyber2000_grphr(EXT_MEM_CTL1, cfb); in cyberpro_common_probe()
1531 cfb->mem_ctl2 = cyber2000_grphr(EXT_MEM_CTL2, cfb); in cyberpro_common_probe()
1536 switch (cfb->mem_ctl2 & MEM_CTL2_SIZE_MASK) { in cyberpro_common_probe()
1551 cfb->fb.fix.smem_len = smem_size; in cyberpro_common_probe()
1552 cfb->fb.fix.mmio_len = MMIO_SIZE; in cyberpro_common_probe()
1553 cfb->fb.screen_base = cfb->region; in cyberpro_common_probe()
1557 cfb->ddc_registered = true; in cyberpro_common_probe()
1560 err = -EINVAL; in cyberpro_common_probe()
1561 if (!fb_find_mode(&cfb->fb.var, &cfb->fb, NULL, NULL, 0, in cyberpro_common_probe()
1563 printk(KERN_ERR "%s: no valid mode found\n", cfb->fb.fix.id); in cyberpro_common_probe()
1567 cfb->fb.var.yres_virtual = cfb->fb.fix.smem_len * 8 / in cyberpro_common_probe()
1568 (cfb->fb.var.bits_per_pixel * cfb->fb.var.xres_virtual); in cyberpro_common_probe()
1570 if (cfb->fb.var.yres_virtual < cfb->fb.var.yres) in cyberpro_common_probe()
1571 cfb->fb.var.yres_virtual = cfb->fb.var.yres; in cyberpro_common_probe()
1573 /* fb_set_var(&cfb->fb.var, -1, &cfb->fb); */ in cyberpro_common_probe()
1578 * the precision and fit the results into 32-bit registers. in cyberpro_common_probe()
1581 h_sync = 1953125000 / cfb->fb.var.pixclock; in cyberpro_common_probe()
1582 h_sync = h_sync * 512 / (cfb->fb.var.xres + cfb->fb.var.left_margin + in cyberpro_common_probe()
1583 cfb->fb.var.right_margin + cfb->fb.var.hsync_len); in cyberpro_common_probe()
1584 v_sync = h_sync / (cfb->fb.var.yres + cfb->fb.var.upper_margin + in cyberpro_common_probe()
1585 cfb->fb.var.lower_margin + cfb->fb.var.vsync_len); in cyberpro_common_probe()
1588 cfb->fb.fix.id, cfb->fb.fix.smem_len >> 10, in cyberpro_common_probe()
1589 cfb->fb.var.xres, cfb->fb.var.yres, in cyberpro_common_probe()
1596 err = register_framebuffer(&cfb->fb); in cyberpro_common_probe()
1602 if (err && cfb->ddc_registered) in cyberpro_common_probe()
1603 i2c_del_adapter(&cfb->ddc_adapter); in cyberpro_common_probe()
1610 unregister_framebuffer(&cfb->fb); in cyberpro_common_remove()
1612 if (cfb->ddc_registered) in cyberpro_common_remove()
1613 i2c_del_adapter(&cfb->ddc_adapter); in cyberpro_common_remove()
1625 cyber2000_grphw(EXT_MEM_CTL1, cfb->mem_ctl1, cfb); in cyberpro_common_resume()
1626 cyber2000_grphw(EXT_MEM_CTL2, cfb->mem_ctl2, cfb); in cyberpro_common_resume()
1632 cyber2000fb_set_par(&cfb->fb); in cyberpro_common_resume()
1662 return -ENOMEM; in cyberpro_pci_enable_mmio()
1675 * we use the standard IO-based wakeup. in cyberpro_pci_enable_mmio()
1687 if (cfb->id == ID_CYBERPRO_2010) { in cyberpro_pci_enable_mmio()
1689 cfb->fb.fix.id); in cyberpro_pci_enable_mmio()
1694 cfb->fb.fix.id); in cyberpro_pci_enable_mmio()
1698 if (cfb->id == ID_CYBERPRO_5000) in cyberpro_pci_enable_mmio()
1715 sprintf(name, "CyberPro%4X", id->device); in cyberpro_pci_probe()
1725 err = -ENOMEM; in cyberpro_pci_probe()
1726 cfb = cyberpro_alloc_fb_info(id->driver_data, name); in cyberpro_pci_probe()
1730 err = pci_request_regions(dev, cfb->fb.fix.id); in cyberpro_pci_probe()
1734 cfb->irq = dev->irq; in cyberpro_pci_probe()
1735 cfb->region = pci_ioremap_bar(dev, 0); in cyberpro_pci_probe()
1736 if (!cfb->region) { in cyberpro_pci_probe()
1737 err = -ENOMEM; in cyberpro_pci_probe()
1741 cfb->regs = cfb->region + MMIO_OFFSET; in cyberpro_pci_probe()
1742 cfb->fb.device = &dev->dev; in cyberpro_pci_probe()
1743 cfb->fb.fix.mmio_start = pci_resource_start(dev, 0) + MMIO_OFFSET; in cyberpro_pci_probe()
1744 cfb->fb.fix.smem_start = pci_resource_start(dev, 0); in cyberpro_pci_probe()
1747 * Bring up the hardware. This is expected to enable access in cyberpro_pci_probe()
1759 cfb->mclk_mult = cyber2000_grphr(EXT_MCLK_MULT, cfb); in cyberpro_pci_probe()
1760 cfb->mclk_div = cyber2000_grphr(EXT_MCLK_DIV, cfb); in cyberpro_pci_probe()
1767 cfb->mclk_mult = 0xdb; in cyberpro_pci_probe()
1768 cfb->mclk_div = 0x54; in cyberpro_pci_probe()
1786 iounmap(cfb->region); in cyberpro_pci_probe()
1802 iounmap(cfb->region); in cyberpro_pci_remove()
1819 * Re-initialise the CyberPro hardware
1870 int ret = -1, err; in cyber2000fb_init()
1877 return -ENODEV; in cyber2000fb_init()
1881 return -ENODEV; in cyber2000fb_init()