diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2011-04-20 14:09:47 +1000 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2011-04-20 14:09:47 +1000 |
commit | a3bf4e2713420a4426be9e86de67480268129042 (patch) | |
tree | 5c85e159f5a23708831bcf09e3012cf66a65333b | |
parent | 36bfeed1bf3acf642c64c354860e05c9edb05474 (diff) |
Revert "s3fb: add DDC support"
This reverts commit 86c0f043a737dadf034a4e6f29aefb074f4a1146.
-rw-r--r-- | drivers/video/Kconfig | 8 | ||||
-rw-r--r-- | drivers/video/s3fb.c | 206 |
2 files changed, 5 insertions, 209 deletions
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index c5ec5b406546..62f337ab52bc 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -1460,14 +1460,6 @@ config FB_S3 ---help--- Driver for graphics boards with S3 Trio / S3 Virge chip. -config FB_S3_DDC - bool "DDC for S3 support" - depends on FB_S3 - select FB_DDC - default y - help - Say Y here if you want DDC support for your S3 graphics card. - config FB_SAVAGE tristate "S3 Savage support" depends on FB && PCI && EXPERIMENTAL diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c index 9a345209535b..c4482f2e5799 100644 --- a/drivers/video/s3fb.c +++ b/drivers/video/s3fb.c @@ -25,9 +25,6 @@ #include <linux/console.h> /* Why should fb driver call console functions? because console_lock() */ #include <video/vga.h> -#include <linux/i2c.h> -#include <linux/i2c-algo-bit.h> - #ifdef CONFIG_MTRR #include <asm/mtrr.h> #endif @@ -39,12 +36,6 @@ struct s3fb_info { struct mutex open_lock; unsigned int ref_count; u32 pseudo_palette[16]; -#ifdef CONFIG_FB_S3_DDC - u8 __iomem *mmio; - bool ddc_registered; - struct i2c_adapter ddc_adapter; - struct i2c_algo_bit_data ddc_algo; -#endif }; @@ -114,9 +105,6 @@ static const char * const s3_names[] = {"S3 Unknown", "S3 Trio32", "S3 Trio64", #define CHIP_UNDECIDED_FLAG 0x80 #define CHIP_MASK 0xFF -#define MMIO_OFFSET 0x1000000 -#define MMIO_SIZE 0x10000 - /* CRT timing register sets */ static const struct vga_regset s3_h_total_regs[] = {{0x00, 0, 7}, {0x5D, 0, 0}, VGA_REGSET_END}; @@ -152,7 +140,7 @@ static const struct svga_timing_regs s3_timing_regs = { /* Module parameters */ -static char *mode_option __devinitdata; +static char *mode_option __devinitdata = "640x480-8@60"; #ifdef CONFIG_MTRR static int mtrr __devinitdata = 1; @@ -181,119 +169,6 @@ MODULE_PARM_DESC(fasttext, "Enable S3 fast text mode (1=enable, 0=disable, defau /* ------------------------------------------------------------------------- */ -#ifdef CONFIG_FB_S3_DDC - -#define DDC_REG 0xaa /* Trio 3D/1X/2X */ -#define DDC_MMIO_REG 0xff20 /* all other chips */ -#define DDC_SCL_OUT (1 << 0) -#define DDC_SDA_OUT (1 << 1) -#define DDC_SCL_IN (1 << 2) -#define DDC_SDA_IN (1 << 3) -#define DDC_DRIVE_EN (1 << 4) - -static bool s3fb_ddc_needs_mmio(int chip) -{ - return !(chip == CHIP_360_TRIO3D_1X || - chip == CHIP_362_TRIO3D_2X || - chip == CHIP_368_TRIO3D_2X); -} - -static u8 s3fb_ddc_read(struct s3fb_info *par) -{ - if (s3fb_ddc_needs_mmio(par->chip)) - return readb(par->mmio + DDC_MMIO_REG); - else - return vga_rcrt(par->state.vgabase, DDC_REG); -} - -static void s3fb_ddc_write(struct s3fb_info *par, u8 val) -{ - if (s3fb_ddc_needs_mmio(par->chip)) - writeb(val, par->mmio + DDC_MMIO_REG); - else - vga_wcrt(par->state.vgabase, DDC_REG, val); -} - -static void s3fb_ddc_setscl(void *data, int val) -{ - struct s3fb_info *par = data; - unsigned char reg; - - reg = s3fb_ddc_read(par) | DDC_DRIVE_EN; - if (val) - reg |= DDC_SCL_OUT; - else - reg &= ~DDC_SCL_OUT; - s3fb_ddc_write(par, reg); -} - -static void s3fb_ddc_setsda(void *data, int val) -{ - struct s3fb_info *par = data; - unsigned char reg; - - reg = s3fb_ddc_read(par) | DDC_DRIVE_EN; - if (val) - reg |= DDC_SDA_OUT; - else - reg &= ~DDC_SDA_OUT; - s3fb_ddc_write(par, reg); -} - -static int s3fb_ddc_getscl(void *data) -{ - struct s3fb_info *par = data; - - return !!(s3fb_ddc_read(par) & DDC_SCL_IN); -} - -static int s3fb_ddc_getsda(void *data) -{ - struct s3fb_info *par = data; - - return !!(s3fb_ddc_read(par) & DDC_SDA_IN); -} - -static int __devinit s3fb_setup_ddc_bus(struct fb_info *info) -{ - struct s3fb_info *par = info->par; - - strlcpy(par->ddc_adapter.name, info->fix.id, - sizeof(par->ddc_adapter.name)); - par->ddc_adapter.owner = THIS_MODULE; - par->ddc_adapter.class = I2C_CLASS_DDC; - par->ddc_adapter.algo_data = &par->ddc_algo; - par->ddc_adapter.dev.parent = info->device; - par->ddc_algo.setsda = s3fb_ddc_setsda; - par->ddc_algo.setscl = s3fb_ddc_setscl; - par->ddc_algo.getsda = s3fb_ddc_getsda; - par->ddc_algo.getscl = s3fb_ddc_getscl; - par->ddc_algo.udelay = 10; - par->ddc_algo.timeout = 20; - par->ddc_algo.data = par; - - i2c_set_adapdata(&par->ddc_adapter, par); - - /* - * some Virge cards have external MUX to switch chip I2C bus between - * DDC and extension pins - switch it do DDC - */ -/* vga_wseq(par->state.vgabase, 0x08, 0x06); - not needed, already unlocked */ - if (par->chip == CHIP_357_VIRGE_GX2 || - par->chip == CHIP_359_VIRGE_GX2P) - svga_wseq_mask(par->state.vgabase, 0x0d, 0x01, 0x03); - else - svga_wseq_mask(par->state.vgabase, 0x0d, 0x00, 0x03); - /* some Virge need this or the DDC is ignored */ - svga_wcrt_mask(par->state.vgabase, 0x5c, 0x03, 0x03); - - return i2c_bit_add_bus(&par->ddc_adapter); -} -#endif /* CONFIG_FB_S3_DDC */ - - -/* ------------------------------------------------------------------------- */ - /* Set font in S3 fast text mode */ static void s3fb_settile_fast(struct fb_info *info, struct fb_tilemap *map) @@ -1119,7 +994,6 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i struct s3fb_info *par; int rc; u8 regval, cr38, cr39; - bool found = false; /* Ignore secondary VGA device because there is no VGA arbitration */ if (! svga_primary_device(dev)) { @@ -1236,69 +1110,12 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i info->fix.ypanstep = 0; info->fix.accel = FB_ACCEL_NONE; info->pseudo_palette = (void*) (par->pseudo_palette); - info->var.bits_per_pixel = 8; - -#ifdef CONFIG_FB_S3_DDC - /* Enable MMIO if needed */ - if (s3fb_ddc_needs_mmio(par->chip)) { - par->mmio = ioremap(info->fix.smem_start + MMIO_OFFSET, MMIO_SIZE); - if (par->mmio) - svga_wcrt_mask(par->state.vgabase, 0x53, 0x08, 0x08); /* enable MMIO */ - else - dev_err(info->device, "unable to map MMIO at 0x%lx, disabling DDC", - info->fix.smem_start + MMIO_OFFSET); - } - if (!s3fb_ddc_needs_mmio(par->chip) || par->mmio) - if (s3fb_setup_ddc_bus(info) == 0) { - u8 *edid = fb_ddc_read(&par->ddc_adapter); - par->ddc_registered = true; - if (edid) { - fb_edid_to_monspecs(edid, &info->monspecs); - kfree(edid); - if (!info->monspecs.modedb) - dev_err(info->device, "error getting mode database\n"); - else { - const struct fb_videomode *m; - - fb_videomode_to_modelist(info->monspecs.modedb, - info->monspecs.modedb_len, - &info->modelist); - m = fb_find_best_display(&info->monspecs, &info->modelist); - if (m) { - fb_videomode_to_var(&info->var, m); - /* fill all other info->var's fields */ - if (s3fb_check_var(&info->var, info) == 0) - found = true; - } - } - } - } -#endif - if (!mode_option && !found) - mode_option = "640x480-8@60"; /* Prepare startup mode */ - if (mode_option) { - rc = fb_find_mode(&info->var, info, mode_option, - info->monspecs.modedb, info->monspecs.modedb_len, - NULL, info->var.bits_per_pixel); - if (!rc || rc == 4) { - rc = -EINVAL; - dev_err(info->device, "mode %s not found\n", mode_option); - fb_destroy_modedb(info->monspecs.modedb); - info->monspecs.modedb = NULL; - goto err_find_mode; - } - } - - fb_destroy_modedb(info->monspecs.modedb); - info->monspecs.modedb = NULL; - - /* maximize virtual vertical size for fast scrolling */ - info->var.yres_virtual = info->fix.smem_len * 8 / - (info->var.bits_per_pixel * info->var.xres_virtual); - if (info->var.yres_virtual < info->var.yres) { - dev_err(info->device, "virtual vertical size smaller than real\n"); + rc = fb_find_mode(&(info->var), info, mode_option, NULL, 0, NULL, 8); + if (! ((rc == 1) || (rc == 2))) { + rc = -EINVAL; + dev_err(info->device, "mode %s not found\n", mode_option); goto err_find_mode; } @@ -1347,12 +1164,6 @@ err_reg_fb: fb_dealloc_cmap(&info->cmap); err_alloc_cmap: err_find_mode: -#ifdef CONFIG_FB_S3_DDC - if (par->ddc_registered) - i2c_del_adapter(&par->ddc_adapter); - if (par->mmio) - iounmap(par->mmio); -#endif pci_iounmap(dev, info->screen_base); err_iomap: pci_release_regions(dev); @@ -1384,13 +1195,6 @@ static void __devexit s3_pci_remove(struct pci_dev *dev) unregister_framebuffer(info); fb_dealloc_cmap(&info->cmap); -#ifdef CONFIG_FB_S3_DDC - if (par->ddc_registered) - i2c_del_adapter(&par->ddc_adapter); - if (par->mmio) - iounmap(par->mmio); -#endif - pci_iounmap(dev, info->screen_base); pci_release_regions(dev); /* pci_disable_device(dev); */ |