Lines Matching defs:cfb
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))
116 cyber2000_crtcw(unsigned int reg, unsigned int val, struct cfb_info *cfb)
118 cyber2000fb_writew((reg & 255) | val << 8, 0x3d4, cfb);
122 cyber2000_grphw(unsigned int reg, unsigned int val, struct cfb_info *cfb)
124 cyber2000fb_writew((reg & 255) | val << 8, 0x3ce, cfb);
128 cyber2000_grphr(unsigned int reg, struct cfb_info *cfb)
130 cyber2000fb_writeb(reg, 0x3ce, cfb);
131 return cyber2000fb_readb(0x3cf, cfb);
135 cyber2000_attrw(unsigned int reg, unsigned int val, struct cfb_info *cfb)
137 cyber2000fb_readb(0x3da, cfb);
138 cyber2000fb_writeb(reg, 0x3c0, cfb);
139 cyber2000fb_readb(0x3c1, cfb);
140 cyber2000fb_writeb(val, 0x3c0, cfb);
144 cyber2000_seqw(unsigned int reg, unsigned int val, struct cfb_info *cfb)
146 cyber2000fb_writew((reg & 255) | val << 8, 0x3c4, cfb);
157 struct cfb_info *cfb = container_of(info, struct cfb_info, fb);
160 if (!(cfb->fb.var.accel_flags & FB_ACCELF_TEXT)) {
165 cyber2000fb_writeb(0, CO_REG_CONTROL, cfb);
166 cyber2000fb_writew(rect->width - 1, CO_REG_PIXWIDTH, cfb);
167 cyber2000fb_writew(rect->height - 1, CO_REG_PIXHEIGHT, cfb);
170 if (cfb->fb.var.bits_per_pixel > 8)
171 col = ((u32 *)cfb->fb.pseudo_palette)[col];
172 cyber2000fb_writel(col, CO_REG_FGCOLOUR, cfb);
174 dst = rect->dx + rect->dy * cfb->fb.var.xres_virtual;
175 if (cfb->fb.var.bits_per_pixel == 24) {
176 cyber2000fb_writeb(dst, CO_REG_X_PHASE, cfb);
180 cyber2000fb_writel(dst, CO_REG_DEST_PTR, cfb);
181 cyber2000fb_writeb(CO_FG_MIX_SRC, CO_REG_FGMIX, cfb);
182 cyber2000fb_writew(CO_CMD_L_PATTERN_FGCOL, CO_REG_CMD_L, cfb);
183 cyber2000fb_writew(CO_CMD_H_BLITTER, CO_REG_CMD_H, cfb);
189 struct cfb_info *cfb = container_of(info, struct cfb_info, fb);
193 if (!(cfb->fb.var.accel_flags & FB_ACCELF_TEXT)) {
198 cyber2000fb_writeb(0, CO_REG_CONTROL, cfb);
199 cyber2000fb_writew(region->width - 1, CO_REG_PIXWIDTH, cfb);
200 cyber2000fb_writew(region->height - 1, CO_REG_PIXHEIGHT, cfb);
202 src = region->sx + region->sy * cfb->fb.var.xres_virtual;
203 dst = region->dx + region->dy * cfb->fb.var.xres_virtual;
212 src += (region->height - 1) * cfb->fb.var.xres_virtual;
213 dst += (region->height - 1) * cfb->fb.var.xres_virtual;
217 if (cfb->fb.var.bits_per_pixel == 24) {
218 cyber2000fb_writeb(dst, CO_REG_X_PHASE, cfb);
222 cyber2000fb_writel(src, CO_REG_SRC1_PTR, cfb);
223 cyber2000fb_writel(dst, CO_REG_DEST_PTR, cfb);
224 cyber2000fb_writew(CO_FG_MIX_SRC, CO_REG_FGMIX, cfb);
225 cyber2000fb_writew(cmd, CO_REG_CMD_L, cfb);
227 CO_REG_CMD_H, cfb);
239 struct cfb_info *cfb = container_of(info, struct cfb_info, fb);
242 if (!(cfb->fb.var.accel_flags & FB_ACCELF_TEXT))
245 while (cyber2000fb_readb(CO_REG_CONTROL, cfb) & CO_CTRL_BUSY) {
248 cyber2000fb_writeb(0, CO_REG_CONTROL, cfb);
274 struct cfb_info *cfb = container_of(info, struct cfb_info, fb);
275 struct fb_var_screeninfo *var = &cfb->fb.var;
279 switch (cfb->fb.fix.visual) {
300 cfb->palette[regno].red = red;
301 cfb->palette[regno].green = green;
302 cfb->palette[regno].blue = blue;
304 cyber2000fb_writeb(regno, 0x3c8, cfb);
305 cyber2000fb_writeb(red, 0x3c9, cfb);
306 cyber2000fb_writeb(green, 0x3c9, cfb);
307 cyber2000fb_writeb(blue, 0x3c9, cfb);
326 cfb->palette[regno << 2].green = green;
332 cyber2000fb_writeb(regno << 2, 0x3c8, cfb);
333 cyber2000fb_writeb(cfb->palette[regno >> 1].red,
334 0x3c9, cfb);
335 cyber2000fb_writeb(green, 0x3c9, cfb);
336 cyber2000fb_writeb(cfb->palette[regno >> 1].blue,
337 0x3c9, cfb);
339 green = cfb->palette[regno << 3].green;
345 cfb->palette[regno << 3].red = red;
346 cfb->palette[regno << 3].green = green;
347 cfb->palette[regno << 3].blue = blue;
353 cyber2000fb_writeb(regno << 3, 0x3c8, cfb);
354 cyber2000fb_writeb(red, 0x3c9, cfb);
355 cyber2000fb_writeb(green, 0x3c9, cfb);
356 cyber2000fb_writeb(blue, 0x3c9, cfb);
361 cfb->palette[regno << 4].red = red;
362 cfb->palette[regno << 4].green = green;
363 cfb->palette[regno << 4].blue = blue;
369 cyber2000fb_writeb(regno << 4, 0x3c8, cfb);
370 cyber2000fb_writeb(red, 0x3c9, cfb);
371 cyber2000fb_writeb(green, 0x3c9, cfb);
372 cyber2000fb_writeb(blue, 0x3c9, cfb);
408 ((u32 *)cfb->fb.pseudo_palette)[regno] = pseudo_val;
439 static void cyber2000fb_write_ramdac_ctrl(struct cfb_info *cfb)
442 unsigned int val = cfb->ramdac_ctrl | cfb->ramdac_powerdown;
444 cyber2000fb_writeb(0x56, 0x3ce, cfb);
445 i = cyber2000fb_readb(0x3cf, cfb);
446 cyber2000fb_writeb(i | 4, 0x3cf, cfb);
447 cyber2000fb_writeb(val, 0x3c6, cfb);
448 cyber2000fb_writeb(i, 0x3cf, cfb);
450 cyber2000fb_readb(0x3cf, cfb);
453 static void cyber2000fb_set_timing(struct cfb_info *cfb, struct par_info *hw)
461 cyber2000fb_writeb(i, 0x3c8, cfb);
462 cyber2000fb_writeb(0, 0x3c9, cfb);
463 cyber2000fb_writeb(0, 0x3c9, cfb);
464 cyber2000fb_writeb(0, 0x3c9, cfb);
467 cyber2000fb_writeb(0xef, 0x3c2, cfb);
468 cyber2000_crtcw(0x11, 0x0b, cfb);
469 cyber2000_attrw(0x11, 0x00, cfb);
471 cyber2000_seqw(0x00, 0x01, cfb);
472 cyber2000_seqw(0x01, 0x01, cfb);
473 cyber2000_seqw(0x02, 0x0f, cfb);
474 cyber2000_seqw(0x03, 0x00, cfb);
475 cyber2000_seqw(0x04, 0x0e, cfb);
476 cyber2000_seqw(0x00, 0x03, cfb);
479 cyber2000_crtcw(crtc_idx[i], hw->crtc[i], cfb);
482 cyber2000_crtcw(i, 0, cfb);
484 cyber2000_grphw(EXT_CRT_VRTOFL, hw->crtc_ofl, cfb);
485 cyber2000_grphw(0x00, 0x00, cfb);
486 cyber2000_grphw(0x01, 0x00, cfb);
487 cyber2000_grphw(0x02, 0x00, cfb);
488 cyber2000_grphw(0x03, 0x00, cfb);
489 cyber2000_grphw(0x04, 0x00, cfb);
490 cyber2000_grphw(0x05, 0x60, cfb);
491 cyber2000_grphw(0x06, 0x05, cfb);
492 cyber2000_grphw(0x07, 0x0f, cfb);
493 cyber2000_grphw(0x08, 0xff, cfb);
497 cyber2000_attrw(i, i, cfb);
499 cyber2000_attrw(0x10, 0x01, cfb);
500 cyber2000_attrw(0x11, 0x00, cfb);
501 cyber2000_attrw(0x12, 0x0f, cfb);
502 cyber2000_attrw(0x13, 0x00, cfb);
503 cyber2000_attrw(0x14, 0x00, cfb);
506 spin_lock(&cfb->reg_b0_lock);
507 cyber2000_grphw(EXT_DCLK_MULT, hw->clock_mult, cfb);
508 cyber2000_grphw(EXT_DCLK_DIV, hw->clock_div, cfb);
509 cyber2000_grphw(EXT_MCLK_MULT, cfb->mclk_mult, cfb);
510 cyber2000_grphw(EXT_MCLK_DIV, cfb->mclk_div, cfb);
511 cyber2000_grphw(0x90, 0x01, cfb);
512 cyber2000_grphw(0xb9, 0x80, cfb);
513 cyber2000_grphw(0xb9, 0x00, cfb);
514 spin_unlock(&cfb->reg_b0_lock);
516 cfb->ramdac_ctrl = hw->ramdac;
517 cyber2000fb_write_ramdac_ctrl(cfb);
519 cyber2000fb_writeb(0x20, 0x3c0, cfb);
520 cyber2000fb_writeb(0xff, 0x3c6, cfb);
522 cyber2000_grphw(0x14, hw->fetch, cfb);
524 ((hw->pitch >> 4) & 0x30), cfb);
525 cyber2000_grphw(EXT_SEQ_MISC, hw->extseqmisc, cfb);
530 cyber2000fb_writew(hw->width, CO_REG_SRC_WIDTH, cfb);
531 cyber2000fb_writew(hw->width, CO_REG_DEST_WIDTH, cfb);
532 cyber2000fb_writeb(hw->co_pixfmt, CO_REG_PIXFMT, cfb);
536 cyber2000fb_update_start(struct cfb_info *cfb, struct fb_var_screeninfo *var)
551 cyber2000_grphw(0x10, base >> 16 | 0x10, cfb);
552 cyber2000_crtcw(0x0c, base >> 8, cfb);
553 cyber2000_crtcw(0x0d, base, cfb);
559 cyber2000fb_decode_crtc(struct par_info *hw, struct cfb_info *cfb,
660 cyber2000fb_decode_clock(struct par_info *hw, struct cfb_info *cfb,
664 const u_long ref_ps = cfb->ref_ps;
677 new_pll = pll_ps / cfb->divisors[div2];
756 struct cfb_info *cfb = container_of(info, struct cfb_info, fb);
837 if (mem > cfb->fb.fix.smem_len)
838 var->yres_virtual = cfb->fb.fix.smem_len * 8 /
846 err = cyber2000fb_decode_clock(&hw, cfb, var);
850 err = cyber2000fb_decode_crtc(&hw, cfb, var);
859 struct cfb_info *cfb = container_of(info, struct cfb_info, fb);
860 struct fb_var_screeninfo *var = &cfb->fb.var;
923 BUG_ON(cyber2000fb_decode_clock(&hw, cfb, var) != 0);
924 BUG_ON(cyber2000fb_decode_crtc(&hw, cfb, var) != 0);
928 if (!(cfb->mem_ctl2 & MEM_CTL2_64BIT))
932 cfb->fb.fix.line_length = var->xres_virtual * var->bits_per_pixel / 8;
941 mem = cfb->fb.fix.line_length * var->yres_virtual;
942 BUG_ON(mem > cfb->fb.fix.smem_len);
951 cfb->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR;
953 cfb->fb.fix.visual = FB_VISUAL_TRUECOLOR;
955 cfb->fb.fix.visual = FB_VISUAL_DIRECTCOLOR;
957 cyber2000fb_set_timing(cfb, &hw);
958 cyber2000fb_update_start(cfb, var);
969 struct cfb_info *cfb = container_of(info, struct cfb_info, fb);
971 if (cyber2000fb_update_start(cfb, var))
974 cfb->fb.var.xoffset = var->xoffset;
975 cfb->fb.var.yoffset = var->yoffset;
978 cfb->fb.var.vmode |= FB_VMODE_YWRAP;
980 cfb->fb.var.vmode &= ~FB_VMODE_YWRAP;
1005 struct cfb_info *cfb = container_of(info, struct cfb_info, fb);
1024 cyber2000_grphw(EXT_SYNC_CTL, sync, cfb);
1028 cfb->ramdac_powerdown &= ~(RAMDAC_DACPWRDN | RAMDAC_BYPASS |
1030 cyber2000fb_write_ramdac_ctrl(cfb);
1038 cyber2000fb_writeb(i, 0x3c8, cfb);
1039 cyber2000fb_writeb(0, 0x3c9, cfb);
1040 cyber2000fb_writeb(0, 0x3c9, cfb);
1041 cyber2000fb_writeb(0, 0x3c9, cfb);
1045 cyber2000fb_writeb(i, 0x3c8, cfb);
1046 cyber2000fb_writeb(cfb->palette[i].red, 0x3c9, cfb);
1047 cyber2000fb_writeb(cfb->palette[i].green, 0x3c9, cfb);
1048 cyber2000fb_writeb(cfb->palette[i].blue, 0x3c9, cfb);
1054 cfb->ramdac_powerdown |= RAMDAC_DACPWRDN | RAMDAC_BYPASS |
1056 cyber2000fb_write_ramdac_ctrl(cfb);
1085 void cyber2000fb_enable_extregs(struct cfb_info *cfb)
1087 cfb->func_use_count += 1;
1089 if (cfb->func_use_count == 1) {
1092 old = cyber2000_grphr(EXT_FUNC_CTL, cfb);
1094 cyber2000_grphw(EXT_FUNC_CTL, old, cfb);
1102 void cyber2000fb_disable_extregs(struct cfb_info *cfb)
1104 if (cfb->func_use_count == 1) {
1107 old = cyber2000_grphr(EXT_FUNC_CTL, cfb);
1109 cyber2000_grphw(EXT_FUNC_CTL, old, cfb);
1112 if (cfb->func_use_count == 0)
1115 cfb->func_use_count -= 1;
1161 static void cyber2000fb_enable_ddc(struct cfb_info *cfb)
1162 __acquires(&cfb->reg_b0_lock)
1164 spin_lock(&cfb->reg_b0_lock);
1165 cyber2000fb_writew(0x1bf, 0x3ce, cfb);
1168 static void cyber2000fb_disable_ddc(struct cfb_info *cfb)
1169 __releases(&cfb->reg_b0_lock)
1171 cyber2000fb_writew(0x0bf, 0x3ce, cfb);
1172 spin_unlock(&cfb->reg_b0_lock);
1178 struct cfb_info *cfb = data;
1181 cyber2000fb_enable_ddc(cfb);
1182 reg = cyber2000_grphr(DDC_REG, cfb);
1187 cyber2000_grphw(DDC_REG, reg, cfb);
1188 cyber2000fb_disable_ddc(cfb);
1193 struct cfb_info *cfb = data;
1196 cyber2000fb_enable_ddc(cfb);
1197 reg = cyber2000_grphr(DDC_REG, cfb);
1202 cyber2000_grphw(DDC_REG, reg, cfb);
1203 cyber2000fb_disable_ddc(cfb);
1208 struct cfb_info *cfb = data;
1211 cyber2000fb_enable_ddc(cfb);
1212 retval = !!(cyber2000_grphr(DDC_REG, cfb) & DDC_SCL_IN);
1213 cyber2000fb_disable_ddc(cfb);
1220 struct cfb_info *cfb = data;
1223 cyber2000fb_enable_ddc(cfb);
1224 retval = !!(cyber2000_grphr(DDC_REG, cfb) & DDC_SDA_IN);
1225 cyber2000fb_disable_ddc(cfb);
1230 static int cyber2000fb_setup_ddc_bus(struct cfb_info *cfb)
1232 strlcpy(cfb->ddc_adapter.name, cfb->fb.fix.id,
1233 sizeof(cfb->ddc_adapter.name));
1234 cfb->ddc_adapter.owner = THIS_MODULE;
1235 cfb->ddc_adapter.class = I2C_CLASS_DDC;
1236 cfb->ddc_adapter.algo_data = &cfb->ddc_algo;
1237 cfb->ddc_adapter.dev.parent = cfb->fb.device;
1238 cfb->ddc_algo.setsda = cyber2000fb_ddc_setsda;
1239 cfb->ddc_algo.setscl = cyber2000fb_ddc_setscl;
1240 cfb->ddc_algo.getsda = cyber2000fb_ddc_getsda;
1241 cfb->ddc_algo.getscl = cyber2000fb_ddc_getscl;
1242 cfb->ddc_algo.udelay = 10;
1243 cfb->ddc_algo.timeout = 20;
1244 cfb->ddc_algo.data = cfb;
1246 i2c_set_adapdata(&cfb->ddc_adapter, cfb);
1248 return i2c_bit_add_bus(&cfb->ddc_adapter);
1255 struct cfb_info *cfb = data;
1258 spin_lock(&cfb->reg_b0_lock);
1259 latch2 = cyber2000_grphr(EXT_LATCH2, cfb);
1263 cyber2000_grphw(EXT_LATCH2, latch2, cfb);
1264 spin_unlock(&cfb->reg_b0_lock);
1269 struct cfb_info *cfb = data;
1272 spin_lock(&cfb->reg_b0_lock);
1273 latch2 = cyber2000_grphr(EXT_LATCH2, cfb);
1277 cyber2000_grphw(EXT_LATCH2, latch2, cfb);
1278 spin_unlock(&cfb->reg_b0_lock);
1283 struct cfb_info *cfb = data;
1286 spin_lock(&cfb->reg_b0_lock);
1287 ret = !!(cyber2000_grphr(EXT_LATCH2, cfb) & EXT_LATCH2_I2C_DAT);
1288 spin_unlock(&cfb->reg_b0_lock);
1295 struct cfb_info *cfb = data;
1298 spin_lock(&cfb->reg_b0_lock);
1299 ret = !!(cyber2000_grphr(EXT_LATCH2, cfb) & EXT_LATCH2_I2C_CLK);
1300 spin_unlock(&cfb->reg_b0_lock);
1305 static int cyber2000fb_i2c_register(struct cfb_info *cfb)
1307 strlcpy(cfb->i2c_adapter.name, cfb->fb.fix.id,
1308 sizeof(cfb->i2c_adapter.name));
1309 cfb->i2c_adapter.owner = THIS_MODULE;
1310 cfb->i2c_adapter.algo_data = &cfb->i2c_algo;
1311 cfb->i2c_adapter.dev.parent = cfb->fb.device;
1312 cfb->i2c_algo.setsda = cyber2000fb_i2c_setsda;
1313 cfb->i2c_algo.setscl = cyber2000fb_i2c_setscl;
1314 cfb->i2c_algo.getsda = cyber2000fb_i2c_getsda;
1315 cfb->i2c_algo.getscl = cyber2000fb_i2c_getscl;
1316 cfb->i2c_algo.udelay = 5;
1317 cfb->i2c_algo.timeout = msecs_to_jiffies(100);
1318 cfb->i2c_algo.data = cfb;
1320 return i2c_bit_add_bus(&cfb->i2c_adapter);
1323 static void cyber2000fb_i2c_unregister(struct cfb_info *cfb)
1325 i2c_del_adapter(&cfb->i2c_adapter);
1328 #define cyber2000fb_i2c_register(cfb) (0)
1329 #define cyber2000fb_i2c_unregister(cfb) do { } while (0)
1389 static void cyberpro_init_hw(struct cfb_info *cfb)
1394 cyber2000_grphw(igs_regs[i], igs_regs[i + 1], cfb);
1396 if (cfb->id == ID_CYBERPRO_5000) {
1398 cyber2000fb_writeb(0xba, 0x3ce, cfb);
1399 val = cyber2000fb_readb(0x3cf, cfb) & 0x80;
1400 cyber2000fb_writeb(val, 0x3cf, cfb);
1406 struct cfb_info *cfb;
1408 cfb = kzalloc(sizeof(struct cfb_info), GFP_KERNEL);
1409 if (!cfb)
1413 cfb->id = id;
1416 cfb->ref_ps = 40690; /* 24.576 MHz */
1418 cfb->ref_ps = 69842; /* 14.31818 MHz (69841?) */
1420 cfb->divisors[0] = 1;
1421 cfb->divisors[1] = 2;
1422 cfb->divisors[2] = 4;
1425 cfb->divisors[3] = 8;
1427 cfb->divisors[3] = 6;
1429 strcpy(cfb->fb.fix.id, name);
1431 cfb->fb.fix.type = FB_TYPE_PACKED_PIXELS;
1432 cfb->fb.fix.type_aux = 0;
1433 cfb->fb.fix.xpanstep = 0;
1434 cfb->fb.fix.ypanstep = 1;
1435 cfb->fb.fix.ywrapstep = 0;
1439 cfb->fb.fix.accel = 0;
1443 cfb->fb.fix.accel = FB_ACCEL_IGS_CYBER2000;
1447 cfb->fb.fix.accel = FB_ACCEL_IGS_CYBER2010;
1451 cfb->fb.fix.accel = FB_ACCEL_IGS_CYBER5000;
1455 cfb->fb.var.nonstd = 0;
1456 cfb->fb.var.activate = FB_ACTIVATE_NOW;
1457 cfb->fb.var.height = -1;
1458 cfb->fb.var.width = -1;
1459 cfb->fb.var.accel_flags = FB_ACCELF_TEXT;
1461 cfb->fb.fbops = &cyber2000fb_ops;
1462 cfb->fb.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
1463 cfb->fb.pseudo_palette = cfb->pseudo_palette;
1465 spin_lock_init(&cfb->reg_b0_lock);
1467 fb_alloc_cmap(&cfb->fb.cmap, NR_PALETTE, 0);
1469 return cfb;
1472 static void cyberpro_free_fb_info(struct cfb_info *cfb)
1474 if (cfb) {
1478 fb_alloc_cmap(&cfb->fb.cmap, 0, 0);
1480 kfree(cfb);
1523 static int cyberpro_common_probe(struct cfb_info *cfb)
1529 cyberpro_init_hw(cfb);
1536 cfb->mem_ctl1 = cyber2000_grphr(EXT_MEM_CTL1, cfb);
1537 cfb->mem_ctl2 = cyber2000_grphr(EXT_MEM_CTL2, cfb);
1542 switch (cfb->mem_ctl2 & MEM_CTL2_SIZE_MASK) {
1557 cfb->fb.fix.smem_len = smem_size;
1558 cfb->fb.fix.mmio_len = MMIO_SIZE;
1559 cfb->fb.screen_base = cfb->region;
1562 if (cyber2000fb_setup_ddc_bus(cfb) == 0)
1563 cfb->ddc_registered = true;
1567 if (!fb_find_mode(&cfb->fb.var, &cfb->fb, NULL, NULL, 0,
1569 printk(KERN_ERR "%s: no valid mode found\n", cfb->fb.fix.id);
1573 cfb->fb.var.yres_virtual = cfb->fb.fix.smem_len * 8 /
1574 (cfb->fb.var.bits_per_pixel * cfb->fb.var.xres_virtual);
1576 if (cfb->fb.var.yres_virtual < cfb->fb.var.yres)
1577 cfb->fb.var.yres_virtual = cfb->fb.var.yres;
1579 /* fb_set_var(&cfb->fb.var, -1, &cfb->fb); */
1587 h_sync = 1953125000 / cfb->fb.var.pixclock;
1588 h_sync = h_sync * 512 / (cfb->fb.var.xres + cfb->fb.var.left_margin +
1589 cfb->fb.var.right_margin + cfb->fb.var.hsync_len);
1590 v_sync = h_sync / (cfb->fb.var.yres + cfb->fb.var.upper_margin +
1591 cfb->fb.var.lower_margin + cfb->fb.var.vsync_len);
1594 cfb->fb.fix.id, cfb->fb.fix.smem_len >> 10,
1595 cfb->fb.var.xres, cfb->fb.var.yres,
1598 err = cyber2000fb_i2c_register(cfb);
1602 err = register_framebuffer(&cfb->fb);
1604 cyber2000fb_i2c_unregister(cfb);
1608 if (err && cfb->ddc_registered)
1609 i2c_del_adapter(&cfb->ddc_adapter);
1614 static void cyberpro_common_remove(struct cfb_info *cfb)
1616 unregister_framebuffer(&cfb->fb);
1618 if (cfb->ddc_registered)
1619 i2c_del_adapter(&cfb->ddc_adapter);
1621 cyber2000fb_i2c_unregister(cfb);
1624 static void cyberpro_common_resume(struct cfb_info *cfb)
1626 cyberpro_init_hw(cfb);
1631 cyber2000_grphw(EXT_MEM_CTL1, cfb->mem_ctl1, cfb);
1632 cyber2000_grphw(EXT_MEM_CTL2, cfb->mem_ctl2, cfb);
1638 cyber2000fb_set_par(&cfb->fb);
1651 static int cyberpro_pci_enable_mmio(struct cfb_info *cfb)
1693 if (cfb->id == ID_CYBERPRO_2010) {
1695 cfb->fb.fix.id);
1697 val = cyber2000_grphr(EXT_BUS_CTL, cfb);
1700 cfb->fb.fix.id);
1704 if (cfb->id == ID_CYBERPRO_5000)
1707 cyber2000_grphw(EXT_BUS_CTL, val, cfb);
1717 struct cfb_info *cfb;
1728 cfb = cyberpro_alloc_fb_info(id->driver_data, name);
1729 if (!cfb)
1732 err = pci_request_regions(dev, cfb->fb.fix.id);
1736 cfb->irq = dev->irq;
1737 cfb->region = pci_ioremap_bar(dev, 0);
1738 if (!cfb->region) {
1743 cfb->regs = cfb->region + MMIO_OFFSET;
1744 cfb->fb.device = &dev->dev;
1745 cfb->fb.fix.mmio_start = pci_resource_start(dev, 0) + MMIO_OFFSET;
1746 cfb->fb.fix.smem_start = pci_resource_start(dev, 0);
1754 err = cyberpro_pci_enable_mmio(cfb);
1761 cfb->mclk_mult = cyber2000_grphr(EXT_MCLK_MULT, cfb);
1762 cfb->mclk_div = cyber2000_grphr(EXT_MCLK_DIV, cfb);
1769 cfb->mclk_mult = 0xdb;
1770 cfb->mclk_div = 0x54;
1774 err = cyberpro_common_probe(cfb);
1781 pci_set_drvdata(dev, cfb);
1783 int_cfb_info = cfb;
1788 iounmap(cfb->region);
1792 cyberpro_free_fb_info(cfb);
1799 struct cfb_info *cfb = pci_get_drvdata(dev);
1801 if (cfb) {
1802 cyberpro_common_remove(cfb);
1803 iounmap(cfb->region);
1804 cyberpro_free_fb_info(cfb);
1806 if (cfb == int_cfb_info)
1823 struct cfb_info *cfb = dev_get_drvdata(dev);
1825 if (cfb) {
1826 cyberpro_pci_enable_mmio(cfb);
1827 cyberpro_common_resume(cfb);