Lines Matching +full:sync +full:- +full:on +full:- +full:green
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 1998-2002 Russell King
15 * Based on cyberfb.c.
22 * are any such cards, but I'm erring on the side of caution. We don't
49 #include <linux/i2c-algo-bit.h>
52 #include <asm/mach-types.h>
73 u8 red, green, blue; member
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()
242 if (!(cfb->fb.var.accel_flags & FB_ACCELF_TEXT)) in cyber2000fb_sync()
246 if (!count--) { in cyber2000fb_sync()
262 u_int mask = (1 << bf->length) - 1; in convert_bitfield()
264 return (val >> (16 - bf->length) & mask) << bf->offset; in convert_bitfield()
271 cyber2000fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, in cyber2000fb_setcolreg() argument
275 struct fb_var_screeninfo *var = &cfb->fb.var; in cyber2000fb_setcolreg()
279 switch (cfb->fb.fix.visual) { in cyber2000fb_setcolreg()
286 * pixel --/--+--/--> red lut --> red dac in cyber2000fb_setcolreg()
288 * +--/--> green lut --> green dac in cyber2000fb_setcolreg()
290 * +--/--> blue lut --> blue dac in cyber2000fb_setcolreg()
297 green >>= 8; in cyber2000fb_setcolreg()
300 cfb->palette[regno].red = red; in cyber2000fb_setcolreg()
301 cfb->palette[regno].green = green; in cyber2000fb_setcolreg()
302 cfb->palette[regno].blue = blue; in cyber2000fb_setcolreg()
306 cyber2000fb_writeb(green, 0x3c9, cfb); in cyber2000fb_setcolreg()
313 * pixel --/--+--/--> red lut --> red dac in cyber2000fb_setcolreg()
315 * +--/--> green lut --> green dac in cyber2000fb_setcolreg()
317 * +--/--> blue lut --> blue dac in cyber2000fb_setcolreg()
318 * n = bpp, rl = red length, gl = green length, bl = blue length in cyber2000fb_setcolreg()
322 green >>= 8; in cyber2000fb_setcolreg()
325 if (var->green.length == 6 && regno < 64) { in cyber2000fb_setcolreg()
326 cfb->palette[regno << 2].green = green; in cyber2000fb_setcolreg()
329 * The 6 bits of the green component are applied in cyber2000fb_setcolreg()
333 cyber2000fb_writeb(cfb->palette[regno >> 1].red, in cyber2000fb_setcolreg()
335 cyber2000fb_writeb(green, 0x3c9, cfb); in cyber2000fb_setcolreg()
336 cyber2000fb_writeb(cfb->palette[regno >> 1].blue, in cyber2000fb_setcolreg()
339 green = cfb->palette[regno << 3].green; in cyber2000fb_setcolreg()
344 if (var->green.length >= 5 && regno < 32) { in cyber2000fb_setcolreg()
345 cfb->palette[regno << 3].red = red; in cyber2000fb_setcolreg()
346 cfb->palette[regno << 3].green = green; in cyber2000fb_setcolreg()
347 cfb->palette[regno << 3].blue = blue; in cyber2000fb_setcolreg()
355 cyber2000fb_writeb(green, 0x3c9, cfb); in cyber2000fb_setcolreg()
360 if (var->green.length == 4 && regno < 16) { in cyber2000fb_setcolreg()
361 cfb->palette[regno << 4].red = red; in cyber2000fb_setcolreg()
362 cfb->palette[regno << 4].green = green; in cyber2000fb_setcolreg()
363 cfb->palette[regno << 4].blue = blue; in cyber2000fb_setcolreg()
371 cyber2000fb_writeb(green, 0x3c9, cfb); in cyber2000fb_setcolreg()
380 pseudo_val = regno << var->red.offset | in cyber2000fb_setcolreg()
381 regno << var->green.offset | in cyber2000fb_setcolreg()
382 regno << var->blue.offset; in cyber2000fb_setcolreg()
388 * pixel --/--+--/--> red dac in cyber2000fb_setcolreg()
390 * +--/--> green dac in cyber2000fb_setcolreg()
392 * +--/--> blue dac in cyber2000fb_setcolreg()
393 * n = bpp, rl = red length, gl = green length, bl = blue length in cyber2000fb_setcolreg()
396 pseudo_val = convert_bitfield(transp ^ 0xffff, &var->transp); in cyber2000fb_setcolreg()
397 pseudo_val |= convert_bitfield(red, &var->red); in cyber2000fb_setcolreg()
398 pseudo_val |= convert_bitfield(green, &var->green); in cyber2000fb_setcolreg()
399 pseudo_val |= convert_bitfield(blue, &var->blue); in cyber2000fb_setcolreg()
408 ((u32 *)cfb->fb.pseudo_palette)[regno] = pseudo_val; in cyber2000fb_setcolreg()
442 unsigned int val = cfb->ramdac_ctrl | cfb->ramdac_powerdown; in cyber2000fb_write_ramdac_ctrl()
449 /* prevent card lock-up observed on x86 with CyberPro 2000 */ in cyber2000fb_write_ramdac_ctrl()
479 cyber2000_crtcw(crtc_idx[i], hw->crtc[i], cfb); in cyber2000fb_set_timing()
484 cyber2000_grphw(EXT_CRT_VRTOFL, hw->crtc_ofl, cfb); in cyber2000fb_set_timing()
506 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_set_timing()
507 cyber2000_grphw(EXT_DCLK_MULT, hw->clock_mult, cfb); in cyber2000fb_set_timing()
508 cyber2000_grphw(EXT_DCLK_DIV, hw->clock_div, cfb); in cyber2000fb_set_timing()
509 cyber2000_grphw(EXT_MCLK_MULT, cfb->mclk_mult, cfb); in cyber2000fb_set_timing()
510 cyber2000_grphw(EXT_MCLK_DIV, cfb->mclk_div, cfb); in cyber2000fb_set_timing()
514 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_set_timing()
516 cfb->ramdac_ctrl = hw->ramdac; in cyber2000fb_set_timing()
522 cyber2000_grphw(0x14, hw->fetch, cfb); in cyber2000fb_set_timing()
523 cyber2000_grphw(0x15, ((hw->fetch >> 8) & 0x03) | in cyber2000fb_set_timing()
524 ((hw->pitch >> 4) & 0x30), cfb); in cyber2000fb_set_timing()
525 cyber2000_grphw(EXT_SEQ_MISC, hw->extseqmisc, cfb); in cyber2000fb_set_timing()
530 cyber2000fb_writew(hw->width, CO_REG_SRC_WIDTH, cfb); in cyber2000fb_set_timing()
531 cyber2000fb_writew(hw->width, CO_REG_DEST_WIDTH, cfb); in cyber2000fb_set_timing()
532 cyber2000fb_writeb(hw->co_pixfmt, CO_REG_PIXFMT, cfb); in cyber2000fb_set_timing()
538 u_int base = var->yoffset * var->xres_virtual + var->xoffset; in cyber2000fb_update_start()
540 base *= var->bits_per_pixel; in cyber2000fb_update_start()
544 * can only start on 4 byte aligned data. in cyber2000fb_update_start()
549 return -EINVAL; in cyber2000fb_update_start()
566 hw->crtc[13] = hw->pitch; in cyber2000fb_decode_crtc()
567 hw->crtc[17] = 0xe3; in cyber2000fb_decode_crtc()
568 hw->crtc[14] = 0; in cyber2000fb_decode_crtc()
569 hw->crtc[8] = 0; in cyber2000fb_decode_crtc()
571 Htotal = var->xres + var->right_margin + in cyber2000fb_decode_crtc()
572 var->hsync_len + var->left_margin; in cyber2000fb_decode_crtc()
575 return -EINVAL; in cyber2000fb_decode_crtc()
577 hw->crtc[0] = (Htotal >> 3) - 5; in cyber2000fb_decode_crtc()
578 hw->crtc[1] = (var->xres >> 3) - 1; in cyber2000fb_decode_crtc()
579 hw->crtc[2] = var->xres >> 3; in cyber2000fb_decode_crtc()
580 hw->crtc[4] = (var->xres + var->right_margin) >> 3; in cyber2000fb_decode_crtc()
582 Hblankend = (Htotal - 4 * 8) >> 3; in cyber2000fb_decode_crtc()
584 hw->crtc[3] = ENCODE_BIT(Hblankend, 0, 0x1f, 0) | in cyber2000fb_decode_crtc()
587 Hsyncend = (var->xres + var->right_margin + var->hsync_len) >> 3; in cyber2000fb_decode_crtc()
589 hw->crtc[5] = ENCODE_BIT(Hsyncend, 0, 0x1f, 0) | in cyber2000fb_decode_crtc()
592 Vdispend = var->yres - 1; in cyber2000fb_decode_crtc()
593 Vsyncstart = var->yres + var->lower_margin; in cyber2000fb_decode_crtc()
594 Vsyncend = var->yres + var->lower_margin + var->vsync_len; in cyber2000fb_decode_crtc()
595 Vtotal = var->yres + var->lower_margin + var->vsync_len + in cyber2000fb_decode_crtc()
596 var->upper_margin - 2; in cyber2000fb_decode_crtc()
599 return -EINVAL; in cyber2000fb_decode_crtc()
601 Vblankstart = var->yres + 6; in cyber2000fb_decode_crtc()
602 Vblankend = Vtotal - 10; in cyber2000fb_decode_crtc()
604 hw->crtc[6] = Vtotal; in cyber2000fb_decode_crtc()
605 hw->crtc[7] = ENCODE_BIT(Vtotal, 8, 0x01, 0) | in cyber2000fb_decode_crtc()
613 hw->crtc[9] = ENCODE_BIT(0, 0, 0x1f, 0) | in cyber2000fb_decode_crtc()
616 hw->crtc[10] = Vsyncstart; in cyber2000fb_decode_crtc()
617 hw->crtc[11] = ENCODE_BIT(Vsyncend, 0, 0x0f, 0) | in cyber2000fb_decode_crtc()
619 hw->crtc[12] = Vdispend; in cyber2000fb_decode_crtc()
620 hw->crtc[15] = Vblankstart; in cyber2000fb_decode_crtc()
621 hw->crtc[16] = Vblankend; in cyber2000fb_decode_crtc()
622 hw->crtc[18] = 0xff; in cyber2000fb_decode_crtc()
625 * overflow - graphics reg 0x11 in cyber2000fb_decode_crtc()
627 * 4=LINECOMP:10 5-IVIDEO 6=FIXCNT in cyber2000fb_decode_crtc()
629 hw->crtc_ofl = in cyber2000fb_decode_crtc()
638 if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) in cyber2000fb_decode_crtc()
639 hw->crtc_ofl |= EXT_CRT_VRTOFL_INTERLACE; in cyber2000fb_decode_crtc()
663 u_long pll_ps = var->pixclock; in cyber2000fb_decode_clock()
664 const u_long ref_ps = cfb->ref_ps; in cyber2000fb_decode_clock()
677 new_pll = pll_ps / cfb->divisors[div2]; in cyber2000fb_decode_clock()
685 return -EINVAL; in cyber2000fb_decode_clock()
718 diff = pll_ps - t_pll_ps; in cyber2000fb_decode_clock()
720 diff = -diff; in cyber2000fb_decode_clock()
739 hw->clock_mult = best_mult - 1; in cyber2000fb_decode_clock()
740 hw->clock_div = div2 << 6 | (best_div1 - 1); in cyber2000fb_decode_clock()
745 hw->clock_div |= EXT_DCLK_DIV_VFSEL; in cyber2000fb_decode_clock()
761 var->transp.msb_right = 0; in cyber2000fb_check_var()
762 var->red.msb_right = 0; in cyber2000fb_check_var()
763 var->green.msb_right = 0; in cyber2000fb_check_var()
764 var->blue.msb_right = 0; in cyber2000fb_check_var()
765 var->transp.offset = 0; in cyber2000fb_check_var()
766 var->transp.length = 0; in cyber2000fb_check_var()
768 switch (var->bits_per_pixel) { in cyber2000fb_check_var()
770 var->red.offset = 0; in cyber2000fb_check_var()
771 var->red.length = 8; in cyber2000fb_check_var()
772 var->green.offset = 0; in cyber2000fb_check_var()
773 var->green.length = 8; in cyber2000fb_check_var()
774 var->blue.offset = 0; in cyber2000fb_check_var()
775 var->blue.length = 8; in cyber2000fb_check_var()
779 switch (var->green.length) { in cyber2000fb_check_var()
781 var->red.offset = 11; in cyber2000fb_check_var()
782 var->red.length = 5; in cyber2000fb_check_var()
783 var->green.offset = 5; in cyber2000fb_check_var()
784 var->green.length = 6; in cyber2000fb_check_var()
785 var->blue.offset = 0; in cyber2000fb_check_var()
786 var->blue.length = 5; in cyber2000fb_check_var()
791 var->red.offset = 10; in cyber2000fb_check_var()
792 var->red.length = 5; in cyber2000fb_check_var()
793 var->green.offset = 5; in cyber2000fb_check_var()
794 var->green.length = 5; in cyber2000fb_check_var()
795 var->blue.offset = 0; in cyber2000fb_check_var()
796 var->blue.length = 5; in cyber2000fb_check_var()
800 var->transp.offset = 12; in cyber2000fb_check_var()
801 var->transp.length = 4; in cyber2000fb_check_var()
802 var->red.offset = 8; in cyber2000fb_check_var()
803 var->red.length = 4; in cyber2000fb_check_var()
804 var->green.offset = 4; in cyber2000fb_check_var()
805 var->green.length = 4; in cyber2000fb_check_var()
806 var->blue.offset = 0; in cyber2000fb_check_var()
807 var->blue.length = 4; in cyber2000fb_check_var()
813 var->red.offset = 16; in cyber2000fb_check_var()
814 var->red.length = 8; in cyber2000fb_check_var()
815 var->green.offset = 8; in cyber2000fb_check_var()
816 var->green.length = 8; in cyber2000fb_check_var()
817 var->blue.offset = 0; in cyber2000fb_check_var()
818 var->blue.length = 8; in cyber2000fb_check_var()
822 var->transp.offset = 24; in cyber2000fb_check_var()
823 var->transp.length = 8; in cyber2000fb_check_var()
824 var->red.offset = 16; in cyber2000fb_check_var()
825 var->red.length = 8; in cyber2000fb_check_var()
826 var->green.offset = 8; in cyber2000fb_check_var()
827 var->green.length = 8; in cyber2000fb_check_var()
828 var->blue.offset = 0; in cyber2000fb_check_var()
829 var->blue.length = 8; in cyber2000fb_check_var()
833 return -EINVAL; in cyber2000fb_check_var()
836 mem = var->xres_virtual * var->yres_virtual * (var->bits_per_pixel / 8); in cyber2000fb_check_var()
837 if (mem > cfb->fb.fix.smem_len) in cyber2000fb_check_var()
838 var->yres_virtual = cfb->fb.fix.smem_len * 8 / in cyber2000fb_check_var()
839 (var->bits_per_pixel * var->xres_virtual); in cyber2000fb_check_var()
841 if (var->yres > var->yres_virtual) in cyber2000fb_check_var()
842 var->yres = var->yres_virtual; in cyber2000fb_check_var()
843 if (var->xres > var->xres_virtual) in cyber2000fb_check_var()
844 var->xres = var->xres_virtual; in cyber2000fb_check_var()
860 struct fb_var_screeninfo *var = &cfb->fb.var; in cyber2000fb_set_par()
864 hw.width = var->xres_virtual; in cyber2000fb_set_par()
867 switch (var->bits_per_pixel) { in cyber2000fb_set_par()
878 switch (var->green.length) { in cyber2000fb_set_par()
926 hw.width -= 1; in cyber2000fb_set_par()
928 if (!(cfb->mem_ctl2 & MEM_CTL2_64BIT)) in cyber2000fb_set_par()
932 cfb->fb.fix.line_length = var->xres_virtual * var->bits_per_pixel / 8; in cyber2000fb_set_par()
935 * Same here - if the size of the video mode exceeds the in cyber2000fb_set_par()
941 mem = cfb->fb.fix.line_length * var->yres_virtual; in cyber2000fb_set_par()
942 BUG_ON(mem > cfb->fb.fix.smem_len); in cyber2000fb_set_par()
946 * are direct colour or true colour, depending on whether in cyber2000fb_set_par()
950 if (var->bits_per_pixel == 8) in cyber2000fb_set_par()
951 cfb->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR; in cyber2000fb_set_par()
953 cfb->fb.fix.visual = FB_VISUAL_TRUECOLOR; in cyber2000fb_set_par()
955 cfb->fb.fix.visual = FB_VISUAL_DIRECTCOLOR; in cyber2000fb_set_par()
972 return -EINVAL; in cyber2000fb_pan_display()
974 cfb->fb.var.xoffset = var->xoffset; in cyber2000fb_pan_display()
975 cfb->fb.var.yoffset = var->yoffset; in cyber2000fb_pan_display()
977 if (var->vmode & FB_VMODE_YWRAP) { in cyber2000fb_pan_display()
978 cfb->fb.var.vmode |= FB_VMODE_YWRAP; in cyber2000fb_pan_display()
980 cfb->fb.var.vmode &= ~FB_VMODE_YWRAP; in cyber2000fb_pan_display()
992 * succeeded, != 0 if un-/blanking failed due to e.g. a
994 * suspend and powerdown modes on hardware that supports
1001 * run "setterm -powersave powerdown" to take advantage
1006 unsigned int sync = 0; in cyber2000fb_blank() local
1010 case FB_BLANK_POWERDOWN: /* powerdown - both sync lines down */ in cyber2000fb_blank()
1011 sync = EXT_SYNC_CTL_VS_0 | EXT_SYNC_CTL_HS_0; in cyber2000fb_blank()
1014 sync = EXT_SYNC_CTL_VS_NORMAL | EXT_SYNC_CTL_HS_0; in cyber2000fb_blank()
1017 sync = EXT_SYNC_CTL_VS_0 | EXT_SYNC_CTL_HS_NORMAL; in cyber2000fb_blank()
1024 cyber2000_grphw(EXT_SYNC_CTL, sync, cfb); in cyber2000fb_blank()
1027 /* turn on ramdacs */ in cyber2000fb_blank()
1028 cfb->ramdac_powerdown &= ~(RAMDAC_DACPWRDN | RAMDAC_BYPASS | in cyber2000fb_blank()
1046 cyber2000fb_writeb(cfb->palette[i].red, 0x3c9, cfb); in cyber2000fb_blank()
1047 cyber2000fb_writeb(cfb->palette[i].green, 0x3c9, cfb); in cyber2000fb_blank()
1048 cyber2000fb_writeb(cfb->palette[i].blue, 0x3c9, cfb); in cyber2000fb_blank()
1054 cfb->ramdac_powerdown |= RAMDAC_DACPWRDN | RAMDAC_BYPASS | in cyber2000fb_blank()
1087 cfb->func_use_count += 1; in cyber2000fb_enable_extregs()
1089 if (cfb->func_use_count == 1) { in cyber2000fb_enable_extregs()
1104 if (cfb->func_use_count == 1) { in cyber2000fb_disable_extregs()
1112 if (cfb->func_use_count == 0) in cyber2000fb_disable_extregs()
1115 cfb->func_use_count -= 1; in cyber2000fb_disable_extregs()
1125 info->dev = int_cfb_info->fb.device; in cyber2000fb_attach()
1127 info->i2c = &int_cfb_info->i2c_adapter; in cyber2000fb_attach()
1129 info->i2c = NULL; in cyber2000fb_attach()
1131 info->regs = int_cfb_info->regs; in cyber2000fb_attach()
1132 info->irq = int_cfb_info->irq; in cyber2000fb_attach()
1133 info->fb = int_cfb_info->fb.screen_base; in cyber2000fb_attach()
1134 info->fb_size = int_cfb_info->fb.fix.smem_len; in cyber2000fb_attach()
1135 info->info = int_cfb_info; in cyber2000fb_attach()
1137 strscpy(info->dev_name, int_cfb_info->fb.fix.id, in cyber2000fb_attach()
1138 sizeof(info->dev_name)); in cyber2000fb_attach()
1162 __acquires(&cfb->reg_b0_lock) in cyber2000fb_enable_ddc()
1164 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_enable_ddc()
1169 __releases(&cfb->reg_b0_lock) in cyber2000fb_disable_ddc()
1172 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_disable_ddc()
1232 strscpy(cfb->ddc_adapter.name, cfb->fb.fix.id, in cyber2000fb_setup_ddc_bus()
1233 sizeof(cfb->ddc_adapter.name)); in cyber2000fb_setup_ddc_bus()
1234 cfb->ddc_adapter.owner = THIS_MODULE; in cyber2000fb_setup_ddc_bus()
1235 cfb->ddc_adapter.class = I2C_CLASS_DDC; in cyber2000fb_setup_ddc_bus()
1236 cfb->ddc_adapter.algo_data = &cfb->ddc_algo; in cyber2000fb_setup_ddc_bus()
1237 cfb->ddc_adapter.dev.parent = cfb->fb.device; in cyber2000fb_setup_ddc_bus()
1238 cfb->ddc_algo.setsda = cyber2000fb_ddc_setsda; in cyber2000fb_setup_ddc_bus()
1239 cfb->ddc_algo.setscl = cyber2000fb_ddc_setscl; in cyber2000fb_setup_ddc_bus()
1240 cfb->ddc_algo.getsda = cyber2000fb_ddc_getsda; in cyber2000fb_setup_ddc_bus()
1241 cfb->ddc_algo.getscl = cyber2000fb_ddc_getscl; in cyber2000fb_setup_ddc_bus()
1242 cfb->ddc_algo.udelay = 10; in cyber2000fb_setup_ddc_bus()
1243 cfb->ddc_algo.timeout = 20; in cyber2000fb_setup_ddc_bus()
1244 cfb->ddc_algo.data = cfb; in cyber2000fb_setup_ddc_bus()
1246 i2c_set_adapdata(&cfb->ddc_adapter, cfb); in cyber2000fb_setup_ddc_bus()
1248 return i2c_bit_add_bus(&cfb->ddc_adapter); in cyber2000fb_setup_ddc_bus()
1258 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_i2c_setsda()
1264 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_i2c_setsda()
1272 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_i2c_setscl()
1278 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_i2c_setscl()
1286 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_i2c_getsda()
1288 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_i2c_getsda()
1298 spin_lock(&cfb->reg_b0_lock); in cyber2000fb_i2c_getscl()
1300 spin_unlock(&cfb->reg_b0_lock); in cyber2000fb_i2c_getscl()
1307 strscpy(cfb->i2c_adapter.name, cfb->fb.fix.id, in cyber2000fb_i2c_register()
1308 sizeof(cfb->i2c_adapter.name)); in cyber2000fb_i2c_register()
1309 cfb->i2c_adapter.owner = THIS_MODULE; in cyber2000fb_i2c_register()
1310 cfb->i2c_adapter.algo_data = &cfb->i2c_algo; in cyber2000fb_i2c_register()
1311 cfb->i2c_adapter.dev.parent = cfb->fb.device; in cyber2000fb_i2c_register()
1312 cfb->i2c_algo.setsda = cyber2000fb_i2c_setsda; in cyber2000fb_i2c_register()
1313 cfb->i2c_algo.setscl = cyber2000fb_i2c_setscl; in cyber2000fb_i2c_register()
1314 cfb->i2c_algo.getsda = cyber2000fb_i2c_getsda; in cyber2000fb_i2c_register()
1315 cfb->i2c_algo.getscl = cyber2000fb_i2c_getscl; in cyber2000fb_i2c_register()
1316 cfb->i2c_algo.udelay = 5; in cyber2000fb_i2c_register()
1317 cfb->i2c_algo.timeout = msecs_to_jiffies(100); in cyber2000fb_i2c_register()
1318 cfb->i2c_algo.data = cfb; in cyber2000fb_i2c_register()
1320 return i2c_bit_add_bus(&cfb->i2c_adapter); in cyber2000fb_i2c_register()
1325 i2c_del_adapter(&cfb->i2c_adapter); in cyber2000fb_i2c_unregister()
1347 .sync = FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1385 * Initialise the CyberPro hardware. On the CyberPro5XXXX,
1396 if (cfb->id == ID_CYBERPRO_5000) { in cyberpro_init_hw()
1413 cfb->id = id; in cyberpro_alloc_fb_info()
1416 cfb->ref_ps = 40690; /* 24.576 MHz */ in cyberpro_alloc_fb_info()
1418 cfb->ref_ps = 69842; /* 14.31818 MHz (69841?) */ in cyberpro_alloc_fb_info()
1420 cfb->divisors[0] = 1; in cyberpro_alloc_fb_info()
1421 cfb->divisors[1] = 2; in cyberpro_alloc_fb_info()
1422 cfb->divisors[2] = 4; in cyberpro_alloc_fb_info()
1425 cfb->divisors[3] = 8; in cyberpro_alloc_fb_info()
1427 cfb->divisors[3] = 6; in cyberpro_alloc_fb_info()
1429 strcpy(cfb->fb.fix.id, name); in cyberpro_alloc_fb_info()
1431 cfb->fb.fix.type = FB_TYPE_PACKED_PIXELS; in cyberpro_alloc_fb_info()
1432 cfb->fb.fix.type_aux = 0; in cyberpro_alloc_fb_info()
1433 cfb->fb.fix.xpanstep = 0; in cyberpro_alloc_fb_info()
1434 cfb->fb.fix.ypanstep = 1; in cyberpro_alloc_fb_info()
1435 cfb->fb.fix.ywrapstep = 0; in cyberpro_alloc_fb_info()
1439 cfb->fb.fix.accel = 0; in cyberpro_alloc_fb_info()
1443 cfb->fb.fix.accel = FB_ACCEL_IGS_CYBER2000; in cyberpro_alloc_fb_info()
1447 cfb->fb.fix.accel = FB_ACCEL_IGS_CYBER2010; in cyberpro_alloc_fb_info()
1451 cfb->fb.fix.accel = FB_ACCEL_IGS_CYBER5000; in cyberpro_alloc_fb_info()
1455 cfb->fb.var.nonstd = 0; in cyberpro_alloc_fb_info()
1456 cfb->fb.var.activate = FB_ACTIVATE_NOW; in cyberpro_alloc_fb_info()
1457 cfb->fb.var.height = -1; in cyberpro_alloc_fb_info()
1458 cfb->fb.var.width = -1; in cyberpro_alloc_fb_info()
1459 cfb->fb.var.accel_flags = FB_ACCELF_TEXT; in cyberpro_alloc_fb_info()
1461 cfb->fb.fbops = &cyber2000fb_ops; in cyberpro_alloc_fb_info()
1462 cfb->fb.flags = FBINFO_HWACCEL_YPAN; in cyberpro_alloc_fb_info()
1463 cfb->fb.pseudo_palette = cfb->pseudo_palette; in cyberpro_alloc_fb_info()
1465 spin_lock_init(&cfb->reg_b0_lock); in cyberpro_alloc_fb_info()
1467 fb_alloc_cmap(&cfb->fb.cmap, NR_PALETTE, 0); in cyberpro_alloc_fb_info()
1478 fb_alloc_cmap(&cfb->fb.cmap, 0, 0); in cyberpro_free_fb_info()
1516 * The CyberPro chips can be placed on many different bus types.
1517 * This probe function is common to all bus types. The bus-specific
1519 * - enabled access to the linear memory region
1520 * - memory mapped access to the registers
1521 * - initialised mem_ctl1 and mem_ctl2 appropriately.
1536 cfb->mem_ctl1 = cyber2000_grphr(EXT_MEM_CTL1, cfb); in cyberpro_common_probe()
1537 cfb->mem_ctl2 = cyber2000_grphr(EXT_MEM_CTL2, cfb); in cyberpro_common_probe()
1542 switch (cfb->mem_ctl2 & MEM_CTL2_SIZE_MASK) { in cyberpro_common_probe()
1557 cfb->fb.fix.smem_len = smem_size; in cyberpro_common_probe()
1558 cfb->fb.fix.mmio_len = MMIO_SIZE; in cyberpro_common_probe()
1559 cfb->fb.screen_base = cfb->region; in cyberpro_common_probe()
1563 cfb->ddc_registered = true; in cyberpro_common_probe()
1566 err = -EINVAL; in cyberpro_common_probe()
1567 if (!fb_find_mode(&cfb->fb.var, &cfb->fb, NULL, NULL, 0, in cyberpro_common_probe()
1569 printk(KERN_ERR "%s: no valid mode found\n", cfb->fb.fix.id); in cyberpro_common_probe()
1573 cfb->fb.var.yres_virtual = cfb->fb.fix.smem_len * 8 / in cyberpro_common_probe()
1574 (cfb->fb.var.bits_per_pixel * cfb->fb.var.xres_virtual); in cyberpro_common_probe()
1576 if (cfb->fb.var.yres_virtual < cfb->fb.var.yres) in cyberpro_common_probe()
1577 cfb->fb.var.yres_virtual = cfb->fb.var.yres; in cyberpro_common_probe()
1579 /* fb_set_var(&cfb->fb.var, -1, &cfb->fb); */ in cyberpro_common_probe()
1584 * the precision and fit the results into 32-bit registers. in cyberpro_common_probe()
1587 h_sync = 1953125000 / cfb->fb.var.pixclock; in cyberpro_common_probe()
1588 h_sync = h_sync * 512 / (cfb->fb.var.xres + cfb->fb.var.left_margin + in cyberpro_common_probe()
1589 cfb->fb.var.right_margin + cfb->fb.var.hsync_len); in cyberpro_common_probe()
1590 v_sync = h_sync / (cfb->fb.var.yres + cfb->fb.var.upper_margin + in cyberpro_common_probe()
1591 cfb->fb.var.lower_margin + cfb->fb.var.vsync_len); in cyberpro_common_probe()
1594 cfb->fb.fix.id, cfb->fb.fix.smem_len >> 10, in cyberpro_common_probe()
1595 cfb->fb.var.xres, cfb->fb.var.yres, in cyberpro_common_probe()
1602 err = register_framebuffer(&cfb->fb); in cyberpro_common_probe()
1608 if (err && cfb->ddc_registered) in cyberpro_common_probe()
1609 i2c_del_adapter(&cfb->ddc_adapter); in cyberpro_common_probe()
1616 unregister_framebuffer(&cfb->fb); in cyberpro_common_remove()
1618 if (cfb->ddc_registered) in cyberpro_common_remove()
1619 i2c_del_adapter(&cfb->ddc_adapter); in cyberpro_common_remove()
1631 cyber2000_grphw(EXT_MEM_CTL1, cfb->mem_ctl1, cfb); in cyberpro_common_resume()
1632 cyber2000_grphw(EXT_MEM_CTL2, cfb->mem_ctl2, cfb); in cyberpro_common_resume()
1638 cyber2000fb_set_par(&cfb->fb); in cyberpro_common_resume()
1644 * we are running on.
1646 * On x86 and ARM, should we be initialising the CyberPro first via the
1649 * on an x86 system?
1668 return -ENOMEM; in cyberpro_pci_enable_mmio()
1681 * we use the standard IO-based wakeup. in cyberpro_pci_enable_mmio()
1693 if (cfb->id == ID_CYBERPRO_2010) { in cyberpro_pci_enable_mmio()
1695 cfb->fb.fix.id); in cyberpro_pci_enable_mmio()
1700 cfb->fb.fix.id); in cyberpro_pci_enable_mmio()
1704 if (cfb->id == ID_CYBERPRO_5000) in cyberpro_pci_enable_mmio()
1721 sprintf(name, "CyberPro%4X", id->device); in cyberpro_pci_probe()
1731 err = -ENOMEM; in cyberpro_pci_probe()
1732 cfb = cyberpro_alloc_fb_info(id->driver_data, name); in cyberpro_pci_probe()
1736 err = pci_request_regions(dev, cfb->fb.fix.id); in cyberpro_pci_probe()
1740 cfb->irq = dev->irq; in cyberpro_pci_probe()
1741 cfb->region = pci_ioremap_bar(dev, 0); in cyberpro_pci_probe()
1742 if (!cfb->region) { in cyberpro_pci_probe()
1743 err = -ENOMEM; in cyberpro_pci_probe()
1747 cfb->regs = cfb->region + MMIO_OFFSET; in cyberpro_pci_probe()
1748 cfb->fb.device = &dev->dev; in cyberpro_pci_probe()
1749 cfb->fb.fix.mmio_start = pci_resource_start(dev, 0) + MMIO_OFFSET; in cyberpro_pci_probe()
1750 cfb->fb.fix.smem_start = pci_resource_start(dev, 0); in cyberpro_pci_probe()
1765 cfb->mclk_mult = cyber2000_grphr(EXT_MCLK_MULT, cfb); in cyberpro_pci_probe()
1766 cfb->mclk_div = cyber2000_grphr(EXT_MCLK_DIV, cfb); in cyberpro_pci_probe()
1770 * MCLK on the NetWinder and the Shark is fixed at 75MHz in cyberpro_pci_probe()
1773 cfb->mclk_mult = 0xdb; in cyberpro_pci_probe()
1774 cfb->mclk_div = 0x54; in cyberpro_pci_probe()
1792 iounmap(cfb->region); in cyberpro_pci_probe()
1808 iounmap(cfb->region); in cyberpro_pci_remove()
1825 * Re-initialise the CyberPro hardware
1876 int ret = -1, err; in cyber2000fb_init()
1883 return -ENODEV; in cyber2000fb_init()
1887 return -ENODEV; in cyber2000fb_init()