39 #include <linux/module.h>
40 #include <linux/kernel.h>
41 #include <linux/errno.h>
42 #include <linux/string.h>
44 #include <linux/slab.h>
47 #include <linux/pci.h>
50 #include <linux/i2c.h>
53 #include <asm/pgtable.h>
95 #ifdef CONFIG_FB_CYBER2000_DDC
101 #ifdef CONFIG_FB_CYBER2000_I2C
107 static char *default_font =
"Acorn8x8";
114 #define cyber2000fb_writel(val, reg, cfb) writel(val, (cfb)->regs + (reg))
115 #define cyber2000fb_writew(val, reg, cfb) writew(val, (cfb)->regs + (reg))
116 #define cyber2000fb_writeb(val, reg, cfb) writeb(val, (cfb)->regs + (reg))
118 #define cyber2000fb_readb(reg, cfb) readb((cfb)->regs + (reg))
132 static inline unsigned int
133 cyber2000_grphr(
unsigned int reg,
struct cfb_info *cfb)
140 cyber2000_attrw(
unsigned int reg,
unsigned int val,
struct cfb_info *cfb)
149 cyber2000_seqw(
unsigned int reg,
unsigned int val,
struct cfb_info *cfb)
163 unsigned long dst, col;
175 if (cfb->
fb.var.bits_per_pixel > 8)
176 col = ((
u32 *)cfb->
fb.pseudo_palette)[col];
179 dst = rect->
dx + rect->
dy * cfb->
fb.var.xres_virtual;
180 if (cfb->
fb.var.bits_per_pixel == 24) {
207 src = region->
sx + region->
sy * cfb->
fb.var.xres_virtual;
208 dst = region->
dx + region->
dy * cfb->
fb.var.xres_virtual;
210 if (region->
sx < region->
dx) {
211 src += region->
width - 1;
212 dst += region->
width - 1;
216 if (region->
sy < region->
dy) {
217 src += (region->
height - 1) * cfb->
fb.var.xres_virtual;
218 dst += (region->
height - 1) * cfb->
fb.var.xres_virtual;
222 if (cfb->
fb.var.bits_per_pixel == 24) {
242 static int cyber2000fb_sync(
struct fb_info *info)
284 switch (cfb->
fb.fix.visual) {
330 if (var->
green.length == 6 && regno < 64) {
344 green = cfb->
palette[regno << 3].green;
349 if (var->
green.length >= 5 && regno < 32) {
365 if (var->
green.length == 4 && regno < 16) {
385 pseudo_val = regno << var->
red.offset |
386 regno << var->
green.offset |
387 regno << var->
blue.offset;
401 pseudo_val = convert_bitfield(transp ^ 0xffff, &var->
transp);
402 pseudo_val |= convert_bitfield(red, &var->
red);
403 pseudo_val |= convert_bitfield(green, &var->
green);
404 pseudo_val |= convert_bitfield(blue, &var->
blue);
413 ((
u32 *)cfb->
fb.pseudo_palette)[regno] = pseudo_val;
438 static const u_char crtc_idx[] = {
439 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
441 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18
444 static void cyber2000fb_write_ramdac_ctrl(
struct cfb_info *cfb)
473 cyber2000_crtcw(0x11, 0x0b, cfb);
474 cyber2000_attrw(0x11, 0x00, cfb);
476 cyber2000_seqw(0x00, 0x01, cfb);
477 cyber2000_seqw(0x01, 0x01, cfb);
478 cyber2000_seqw(0x02, 0x0f, cfb);
479 cyber2000_seqw(0x03, 0x00, cfb);
480 cyber2000_seqw(0x04, 0x0e, cfb);
481 cyber2000_seqw(0x00, 0x03, cfb);
483 for (i = 0; i <
sizeof(crtc_idx); i++)
484 cyber2000_crtcw(crtc_idx[i], hw->
crtc[i], cfb);
486 for (i = 0x0a; i < 0x10; i++)
487 cyber2000_crtcw(i, 0, cfb);
490 cyber2000_grphw(0x00, 0x00, cfb);
491 cyber2000_grphw(0x01, 0x00, cfb);
492 cyber2000_grphw(0x02, 0x00, cfb);
493 cyber2000_grphw(0x03, 0x00, cfb);
494 cyber2000_grphw(0x04, 0x00, cfb);
495 cyber2000_grphw(0x05, 0x60, cfb);
496 cyber2000_grphw(0x06, 0x05, cfb);
497 cyber2000_grphw(0x07, 0x0f, cfb);
498 cyber2000_grphw(0x08, 0xff, cfb);
501 for (i = 0; i < 16; i++)
502 cyber2000_attrw(i, i, cfb);
504 cyber2000_attrw(0x10, 0x01, cfb);
505 cyber2000_attrw(0x11, 0x00, cfb);
506 cyber2000_attrw(0x12, 0x0f, cfb);
507 cyber2000_attrw(0x13, 0x00, cfb);
508 cyber2000_attrw(0x14, 0x00, cfb);
516 cyber2000_grphw(0x90, 0x01, cfb);
517 cyber2000_grphw(0xb9, 0x80, cfb);
518 cyber2000_grphw(0xb9, 0x00, cfb);
522 cyber2000fb_write_ramdac_ctrl(cfb);
527 cyber2000_grphw(0x14, hw->
fetch, cfb);
528 cyber2000_grphw(0x15, ((hw->
fetch >> 8) & 0x03) |
529 ((hw->
pitch >> 4) & 0x30), cfb);
556 cyber2000_grphw(0x10, base >> 16 | 0x10, cfb);
557 cyber2000_crtcw(0x0c, base >> 8, cfb);
558 cyber2000_crtcw(0x0d, base, cfb);
567 u_int Htotal, Hblankend, Hsyncend;
568 u_int Vtotal, Vdispend, Vblankstart, Vblankend, Vsyncstart, Vsyncend;
569 #define ENCODE_BIT(v, b1, m, b2) ((((v) >> (b1)) & (m)) << (b2))
582 hw->
crtc[0] = (Htotal >> 3) - 5;
587 Hblankend = (Htotal - 4 * 8) >> 3;
597 Vdispend = var->
yres - 1;
606 Vblankstart = var->
yres + 6;
607 Vblankend = Vtotal - 10;
609 hw->
crtc[6] = Vtotal;
621 hw->
crtc[10] = Vsyncstart;
624 hw->
crtc[12] = Vdispend;
625 hw->
crtc[15] = Vblankstart;
626 hw->
crtc[16] = Vblankend;
670 u_int div2, t_div1, best_div1, best_mult;
679 for (div2 = 0; div2 < 4; div2++) {
683 if (8696 > new_pll && new_pll > 3846) {
699 best_diff = 0x7fffffff;
702 for (t_div1 = 2; t_div1 < 32; t_div1 += 1) {
703 u_int rr, t_mult, t_pll_ps;
709 rr = ref_ps * t_div1;
710 t_mult = (rr + pll_ps / 2) / pll_ps;
715 if (t_mult > 256 || t_mult < 2)
722 t_pll_ps = (rr + t_mult / 2) / t_mult;
723 diff = pll_ps - t_pll_ps;
727 if (diff < best_diff) {
745 hw->
clock_div = div2 << 6 | (best_div1 - 1);
747 vco = ref_ps * best_div1 / best_mult;
748 if ((ref_ps == 40690) && (vco < 5556))
766 var->
transp.msb_right = 0;
767 var->
red.msb_right = 0;
768 var->
green.msb_right = 0;
769 var->
blue.msb_right = 0;
777 var->
green.offset = 0;
778 var->
green.length = 8;
779 var->
blue.offset = 0;
780 var->
blue.length = 8;
784 switch (var->
green.length) {
786 var->
red.offset = 11;
788 var->
green.offset = 5;
789 var->
green.length = 6;
790 var->
blue.offset = 0;
791 var->
blue.length = 5;
796 var->
red.offset = 10;
798 var->
green.offset = 5;
799 var->
green.length = 5;
800 var->
blue.offset = 0;
801 var->
blue.length = 5;
809 var->
green.offset = 4;
810 var->
green.length = 4;
811 var->
blue.offset = 0;
812 var->
blue.length = 4;
818 var->
red.offset = 16;
820 var->
green.offset = 8;
821 var->
green.length = 8;
822 var->
blue.offset = 0;
823 var->
blue.length = 8;
829 var->
red.offset = 16;
831 var->
green.offset = 8;
832 var->
green.length = 8;
833 var->
blue.offset = 0;
834 var->
blue.length = 8;
842 if (mem > cfb->
fb.fix.smem_len)
851 err = cyber2000fb_decode_clock(&hw, cfb, var);
855 err = cyber2000fb_decode_crtc(&hw, cfb, var);
862 static int cyber2000fb_set_par(
struct fb_info *info)
883 switch (var->
green.length) {
928 BUG_ON(cyber2000fb_decode_clock(&hw, cfb, var) != 0);
929 BUG_ON(cyber2000fb_decode_crtc(&hw, cfb, var) != 0);
962 cyber2000fb_set_timing(cfb, &hw);
963 cyber2000fb_update_start(cfb, var);
976 if (cyber2000fb_update_start(cfb, var))
1008 static int cyber2000fb_blank(
int blank,
struct fb_info *info)
1011 unsigned int sync = 0;
1035 cyber2000fb_write_ramdac_ctrl(cfb);
1061 cyber2000fb_write_ramdac_ctrl(cfb);
1067 static struct fb_ops cyber2000fb_ops = {
1069 .fb_check_var = cyber2000fb_check_var,
1070 .fb_set_par = cyber2000fb_set_par,
1071 .fb_setcolreg = cyber2000fb_setcolreg,
1072 .fb_blank = cyber2000fb_blank,
1073 .fb_pan_display = cyber2000fb_pan_display,
1074 .fb_fillrect = cyber2000fb_fillrect,
1075 .fb_copyarea = cyber2000fb_copyarea,
1076 .fb_imageblit = cyber2000fb_imageblit,
1077 .fb_sync = cyber2000fb_sync,
1085 static struct cfb_info *int_cfb_info;
1129 if (int_cfb_info !=
NULL) {
1130 info->
dev = int_cfb_info->
fb.device;
1131 #ifdef CONFIG_FB_CYBER2000_I2C
1132 info->
i2c = &int_cfb_info->i2c_adapter;
1137 info->
irq = int_cfb_info->
irq;
1138 info->
fb = int_cfb_info->
fb.screen_base;
1139 info->
fb_size = int_cfb_info->
fb.fix.smem_len;
1140 info->
info = int_cfb_info;
1146 return int_cfb_info !=
NULL;
1158 #ifdef CONFIG_FB_CYBER2000_DDC
1160 #define DDC_REG 0xb0
1161 #define DDC_SCL_OUT (1 << 0)
1162 #define DDC_SDA_OUT (1 << 4)
1163 #define DDC_SCL_IN (1 << 2)
1164 #define DDC_SDA_IN (1 << 6)
1166 static void cyber2000fb_enable_ddc(
struct cfb_info *cfb)
1172 static void cyber2000fb_disable_ddc(
struct cfb_info *cfb)
1179 static void cyber2000fb_ddc_setscl(
void *
data,
int val)
1184 cyber2000fb_enable_ddc(cfb);
1185 reg = cyber2000_grphr(DDC_REG, cfb);
1190 cyber2000_grphw(DDC_REG, reg, cfb);
1191 cyber2000fb_disable_ddc(cfb);
1194 static void cyber2000fb_ddc_setsda(
void *data,
int val)
1199 cyber2000fb_enable_ddc(cfb);
1200 reg = cyber2000_grphr(DDC_REG, cfb);
1205 cyber2000_grphw(DDC_REG, reg, cfb);
1206 cyber2000fb_disable_ddc(cfb);
1209 static int cyber2000fb_ddc_getscl(
void *data)
1214 cyber2000fb_enable_ddc(cfb);
1215 retval = !!(cyber2000_grphr(DDC_REG, cfb) &
DDC_SCL_IN);
1216 cyber2000fb_disable_ddc(cfb);
1221 static int cyber2000fb_ddc_getsda(
void *data)
1226 cyber2000fb_enable_ddc(cfb);
1227 retval = !!(cyber2000_grphr(DDC_REG, cfb) &
DDC_SDA_IN);
1228 cyber2000fb_disable_ddc(cfb);
1235 strlcpy(cfb->ddc_adapter.name, cfb->
fb.fix.id,
1236 sizeof(cfb->ddc_adapter.name));
1239 cfb->ddc_adapter.algo_data = &cfb->ddc_algo;
1240 cfb->ddc_adapter.dev.parent = cfb->
fb.device;
1241 cfb->ddc_algo.setsda = cyber2000fb_ddc_setsda;
1242 cfb->ddc_algo.setscl = cyber2000fb_ddc_setscl;
1243 cfb->ddc_algo.getsda = cyber2000fb_ddc_getsda;
1244 cfb->ddc_algo.getscl = cyber2000fb_ddc_getscl;
1245 cfb->ddc_algo.udelay = 10;
1246 cfb->ddc_algo.timeout = 20;
1247 cfb->ddc_algo.data =
cfb;
1249 i2c_set_adapdata(&cfb->ddc_adapter, cfb);
1255 #ifdef CONFIG_FB_CYBER2000_I2C
1256 static void cyber2000fb_i2c_setsda(
void *data,
int state)
1259 unsigned int latch2;
1270 static void cyber2000fb_i2c_setscl(
void *data,
int state)
1273 unsigned int latch2;
1284 static int cyber2000fb_i2c_getsda(
void *data)
1296 static int cyber2000fb_i2c_getscl(
void *data)
1310 strlcpy(cfb->i2c_adapter.name, cfb->
fb.fix.id,
1311 sizeof(cfb->i2c_adapter.name));
1313 cfb->i2c_adapter.algo_data = &cfb->i2c_algo;
1314 cfb->i2c_adapter.dev.parent = cfb->
fb.device;
1315 cfb->i2c_algo.setsda = cyber2000fb_i2c_setsda;
1316 cfb->i2c_algo.setscl = cyber2000fb_i2c_setscl;
1317 cfb->i2c_algo.getsda = cyber2000fb_i2c_getsda;
1318 cfb->i2c_algo.getscl = cyber2000fb_i2c_getscl;
1319 cfb->i2c_algo.udelay = 5;
1321 cfb->i2c_algo.data =
cfb;
1331 #define cyber2000fb_i2c_register(cfb) (0)
1332 #define cyber2000fb_i2c_unregister(cfb) do { } while (0)
1354 static char igs_regs[] = {
1365 CURS_H_START + 1, 0,
1368 CURS_V_START + 1, 0,
1382 EXT_FIFO_CTL + 1, 0x17,
1392 static void cyberpro_init_hw(
struct cfb_info *cfb)
1396 for (i = 0; i <
sizeof(igs_regs); i += 2)
1397 cyber2000_grphw(igs_regs[i], igs_regs[i + 1], cfb);
1436 cfb->
fb.fix.type_aux = 0;
1437 cfb->
fb.fix.xpanstep = 0;
1438 cfb->
fb.fix.ypanstep = 1;
1439 cfb->
fb.fix.ywrapstep = 0;
1443 cfb->
fb.fix.accel = 0;
1459 cfb->
fb.var.nonstd = 0;
1461 cfb->
fb.var.height = -1;
1462 cfb->
fb.var.width = -1;
1465 cfb->
fb.fbops = &cyber2000fb_ops;
1476 static void cyberpro_free_fb_info(
struct cfb_info *cfb)
1493 static int cyber2000fb_setup(
char *
options)
1497 if (!options || !*options)
1500 while ((opt =
strsep(&options,
",")) !=
NULL) {
1504 if (
strncmp(opt,
"font:", 5) == 0) {
1505 static char default_font_storage[40];
1507 strlcpy(default_font_storage, opt + 5,
1508 sizeof(default_font_storage));
1509 default_font = default_font_storage;
1530 u_int h_sync, v_sync;
1533 cyberpro_init_hw(cfb);
1548 smem_size = 0x00400000;
1551 smem_size = 0x00200000;
1554 smem_size = 0x00100000;
1557 smem_size = 0x00100000;
1561 cfb->
fb.fix.smem_len = smem_size;
1565 #ifdef CONFIG_FB_CYBER2000_DDC
1566 if (cyber2000fb_setup_ddc_bus(cfb) == 0)
1567 cfb->ddc_registered =
true;
1572 &cyber2000fb_default_mode, 8)) {
1577 cfb->
fb.var.yres_virtual = cfb->
fb.fix.smem_len * 8 /
1578 (cfb->
fb.var.bits_per_pixel * cfb->
fb.var.xres_virtual);
1580 if (cfb->
fb.var.yres_virtual < cfb->
fb.var.yres)
1581 cfb->
fb.var.yres_virtual = cfb->
fb.var.yres;
1591 h_sync = 1953125000 / cfb->
fb.var.pixclock;
1592 h_sync = h_sync * 512 / (cfb->
fb.var.xres + cfb->
fb.var.left_margin +
1593 cfb->
fb.var.right_margin + cfb->
fb.var.hsync_len);
1594 v_sync = h_sync / (cfb->
fb.var.yres + cfb->
fb.var.upper_margin +
1595 cfb->
fb.var.lower_margin + cfb->
fb.var.vsync_len);
1598 cfb->
fb.fix.id, cfb->
fb.fix.smem_len >> 10,
1599 cfb->
fb.var.xres, cfb->
fb.var.yres,
1600 h_sync / 1000, h_sync % 1000, v_sync);
1611 #ifdef CONFIG_FB_CYBER2000_DDC
1612 if (err && cfb->ddc_registered)
1621 #ifdef CONFIG_FB_CYBER2000_DDC
1622 if (cfb->ddc_registered)
1628 static void cyberpro_common_resume(
struct cfb_info *cfb)
1630 cyberpro_init_hw(cfb);
1642 cyber2000fb_set_par(&cfb->
fb);
1645 #ifdef CONFIG_ARCH_SHARK
1649 static int __devinit cyberpro_vl_probe(
void)
1659 goto failed_release;
1664 goto failed_ioremap;
1686 err = cyberpro_common_probe(cfb);
1690 if (int_cfb_info ==
NULL)
1698 cyberpro_free_fb_info(cfb);
1720 static int cyberpro_pci_enable_mmio(
struct cfb_info *cfb)
1724 #if defined(__sparc_v9__)
1725 #error "You lose, consult DaveM."
1726 #elif defined(__sparc__)
1734 iop =
ioremap(0x3000000, 0x5000);
1740 writeb(0x18, iop + 0x46e8);
1741 writeb(0x01, iop + 0x102);
1742 writeb(0x08, iop + 0x46e8);
1797 cfb = cyberpro_alloc_fb_info(id->
driver_data, name);
1799 goto failed_release;
1803 goto failed_regions;
1809 goto failed_ioremap;
1813 cfb->
fb.device = &dev->
dev;
1823 err = cyberpro_pci_enable_mmio(cfb);
1843 err = cyberpro_common_probe(cfb);
1850 pci_set_drvdata(dev, cfb);
1851 if (int_cfb_info ==
NULL)
1861 cyberpro_free_fb_info(cfb);
1868 struct cfb_info *cfb = pci_get_drvdata(dev);
1871 cyberpro_common_remove(cfb);
1873 cyberpro_free_fb_info(cfb);
1879 pci_set_drvdata(dev,
NULL);
1880 if (cfb == int_cfb_info)
1881 int_cfb_info =
NULL;
1895 static int cyberpro_pci_resume(
struct pci_dev *dev)
1897 struct cfb_info *cfb = pci_get_drvdata(dev);
1900 cyberpro_pci_enable_mmio(cfb);
1901 cyberpro_common_resume(cfb);
1925 .probe = cyberpro_pci_probe,
1927 .suspend = cyberpro_pci_suspend,
1928 .resume = cyberpro_pci_resume,
1929 .id_table = cyberpro_pci_table
1940 static int __init cyber2000fb_init(
void)
1949 cyber2000fb_setup(option);
1952 #ifdef CONFIG_ARCH_SHARK
1953 err = cyberpro_vl_probe();
1958 err = pci_register_driver(&cyberpro_driver);
1963 return ret ? err : 0;
1967 #ifndef CONFIG_ARCH_SHARK
1968 static void __exit cyberpro_exit(
void)