summaryrefslogtreecommitdiff
path: root/drivers/video/via
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2014-02-13 17:31:38 +0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2014-04-17 09:10:19 +0400
commitf7018c21350204c4cf628462f229d44d03545254 (patch)
tree408787177164cf51cc06f7aabdb04fcff8d2b6aa /drivers/video/via
parentc26ef3eb3c11274bad1b64498d0a134f85755250 (diff)
downloadlinux-f7018c21350204c4cf628462f229d44d03545254.tar.xz
video: move fbdev to drivers/video/fbdev
The drivers/video directory is a mess. It contains generic video related files, directories for backlight, console, linux logo, lots of fbdev device drivers, fbdev framework files. Make some order into the chaos by creating drivers/video/fbdev directory, and move all fbdev related files there. No functionality is changed, although I guess it is possible that some subtle Makefile build order related issue could be created by this patch. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> Acked-by: Rob Clark <robdclark@gmail.com> Acked-by: Jingoo Han <jg1.han@samsung.com> Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/video/via')
-rw-r--r--drivers/video/via/Makefile12
-rw-r--r--drivers/video/via/accel.c547
-rw-r--r--drivers/video/via/accel.h211
-rw-r--r--drivers/video/via/chip.h176
-rw-r--r--drivers/video/via/debug.h41
-rw-r--r--drivers/video/via/dvi.c478
-rw-r--r--drivers/video/via/dvi.h65
-rw-r--r--drivers/video/via/global.c50
-rw-r--r--drivers/video/via/global.h80
-rw-r--r--drivers/video/via/hw.c2134
-rw-r--r--drivers/video/via/hw.h676
-rw-r--r--drivers/video/via/ioctl.c116
-rw-r--r--drivers/video/via/ioctl.h203
-rw-r--r--drivers/video/via/lcd.c1005
-rw-r--r--drivers/video/via/lcd.h89
-rw-r--r--drivers/video/via/share.h332
-rw-r--r--drivers/video/via/tblDPASetting.c86
-rw-r--r--drivers/video/via/tblDPASetting.h45
-rw-r--r--drivers/video/via/via-core.c790
-rw-r--r--drivers/video/via/via-gpio.c316
-rw-r--r--drivers/video/via/via_aux.c88
-rw-r--r--drivers/video/via/via_aux.h93
-rw-r--r--drivers/video/via/via_aux_ch7301.c50
-rw-r--r--drivers/video/via/via_aux_edid.c100
-rw-r--r--drivers/video/via/via_aux_sii164.c54
-rw-r--r--drivers/video/via/via_aux_vt1621.c44
-rw-r--r--drivers/video/via/via_aux_vt1622.c50
-rw-r--r--drivers/video/via/via_aux_vt1625.c50
-rw-r--r--drivers/video/via/via_aux_vt1631.c46
-rw-r--r--drivers/video/via/via_aux_vt1632.c54
-rw-r--r--drivers/video/via/via_aux_vt1636.c46
-rw-r--r--drivers/video/via/via_clock.c368
-rw-r--r--drivers/video/via/via_clock.h76
-rw-r--r--drivers/video/via/via_i2c.c295
-rw-r--r--drivers/video/via/via_modesetting.c230
-rw-r--r--drivers/video/via/via_modesetting.h61
-rw-r--r--drivers/video/via/via_utility.c242
-rw-r--r--drivers/video/via/via_utility.h34
-rw-r--r--drivers/video/via/viafbdev.c2176
-rw-r--r--drivers/video/via/viafbdev.h110
-rw-r--r--drivers/video/via/viamode.c383
-rw-r--r--drivers/video/via/viamode.h63
-rw-r--r--drivers/video/via/vt1636.c244
-rw-r--r--drivers/video/via/vt1636.h44
44 files changed, 0 insertions, 12453 deletions
diff --git a/drivers/video/via/Makefile b/drivers/video/via/Makefile
deleted file mode 100644
index 159f26e6adb5..000000000000
--- a/drivers/video/via/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-#
-# Makefile for the VIA framebuffer driver (for Linux Kernel 2.6)
-#
-
-obj-$(CONFIG_FB_VIA) += viafb.o
-
-viafb-y :=viafbdev.o hw.o via_i2c.o dvi.o lcd.o ioctl.o accel.o \
- via_utility.o vt1636.o global.o tblDPASetting.o viamode.o \
- via-core.o via-gpio.o via_modesetting.o via_clock.o \
- via_aux.o via_aux_edid.o via_aux_vt1636.o via_aux_vt1632.o \
- via_aux_vt1631.o via_aux_vt1625.o via_aux_vt1622.o via_aux_vt1621.o \
- via_aux_sii164.o via_aux_ch7301.o
diff --git a/drivers/video/via/accel.c b/drivers/video/via/accel.c
deleted file mode 100644
index 4b67b8e6030a..000000000000
--- a/drivers/video/via/accel.c
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-#include <linux/via-core.h>
-#include "global.h"
-
-/*
- * Figure out an appropriate bytes-per-pixel setting.
- */
-static int viafb_set_bpp(void __iomem *engine, u8 bpp)
-{
- u32 gemode;
-
- /* Preserve the reserved bits */
- /* Lowest 2 bits to zero gives us no rotation */
- gemode = readl(engine + VIA_REG_GEMODE) & 0xfffffcfc;
- switch (bpp) {
- case 8:
- gemode |= VIA_GEM_8bpp;
- break;
- case 16:
- gemode |= VIA_GEM_16bpp;
- break;
- case 32:
- gemode |= VIA_GEM_32bpp;
- break;
- default:
- printk(KERN_WARNING "viafb_set_bpp: Unsupported bpp %d\n", bpp);
- return -EINVAL;
- }
- writel(gemode, engine + VIA_REG_GEMODE);
- return 0;
-}
-
-
-static int hw_bitblt_1(void __iomem *engine, u8 op, u32 width, u32 height,
- u8 dst_bpp, u32 dst_addr, u32 dst_pitch, u32 dst_x, u32 dst_y,
- u32 *src_mem, u32 src_addr, u32 src_pitch, u32 src_x, u32 src_y,
- u32 fg_color, u32 bg_color, u8 fill_rop)
-{
- u32 ge_cmd = 0, tmp, i;
- int ret;
-
- if (!op || op > 3) {
- printk(KERN_WARNING "hw_bitblt_1: Invalid operation: %d\n", op);
- return -EINVAL;
- }
-
- if (op != VIA_BITBLT_FILL && !src_mem && src_addr == dst_addr) {
- if (src_x < dst_x) {
- ge_cmd |= 0x00008000;
- src_x += width - 1;
- dst_x += width - 1;
- }
- if (src_y < dst_y) {
- ge_cmd |= 0x00004000;
- src_y += height - 1;
- dst_y += height - 1;
- }
- }
-
- if (op == VIA_BITBLT_FILL) {
- switch (fill_rop) {
- case 0x00: /* blackness */
- case 0x5A: /* pattern inversion */
- case 0xF0: /* pattern copy */
- case 0xFF: /* whiteness */
- break;
- default:
- printk(KERN_WARNING "hw_bitblt_1: Invalid fill rop: "
- "%u\n", fill_rop);
- return -EINVAL;
- }
- }
-
- ret = viafb_set_bpp(engine, dst_bpp);
- if (ret)
- return ret;
-
- if (op != VIA_BITBLT_FILL) {
- if (src_x & (op == VIA_BITBLT_MONO ? 0xFFFF8000 : 0xFFFFF000)
- || src_y & 0xFFFFF000) {
- printk(KERN_WARNING "hw_bitblt_1: Unsupported source "
- "x/y %d %d\n", src_x, src_y);
- return -EINVAL;
- }
- tmp = src_x | (src_y << 16);
- writel(tmp, engine + 0x08);
- }
-
- if (dst_x & 0xFFFFF000 || dst_y & 0xFFFFF000) {
- printk(KERN_WARNING "hw_bitblt_1: Unsupported destination x/y "
- "%d %d\n", dst_x, dst_y);
- return -EINVAL;
- }
- tmp = dst_x | (dst_y << 16);
- writel(tmp, engine + 0x0C);
-
- if ((width - 1) & 0xFFFFF000 || (height - 1) & 0xFFFFF000) {
- printk(KERN_WARNING "hw_bitblt_1: Unsupported width/height "
- "%d %d\n", width, height);
- return -EINVAL;
- }
- tmp = (width - 1) | ((height - 1) << 16);
- writel(tmp, engine + 0x10);
-
- if (op != VIA_BITBLT_COLOR)
- writel(fg_color, engine + 0x18);
-
- if (op == VIA_BITBLT_MONO)
- writel(bg_color, engine + 0x1C);
-
- if (op != VIA_BITBLT_FILL) {
- tmp = src_mem ? 0 : src_addr;
- if (dst_addr & 0xE0000007) {
- printk(KERN_WARNING "hw_bitblt_1: Unsupported source "
- "address %X\n", tmp);
- return -EINVAL;
- }
- tmp >>= 3;
- writel(tmp, engine + 0x30);
- }
-
- if (dst_addr & 0xE0000007) {
- printk(KERN_WARNING "hw_bitblt_1: Unsupported destination "
- "address %X\n", dst_addr);
- return -EINVAL;
- }
- tmp = dst_addr >> 3;
- writel(tmp, engine + 0x34);
-
- if (op == VIA_BITBLT_FILL)
- tmp = 0;
- else
- tmp = src_pitch;
- if (tmp & 0xFFFFC007 || dst_pitch & 0xFFFFC007) {
- printk(KERN_WARNING "hw_bitblt_1: Unsupported pitch %X %X\n",
- tmp, dst_pitch);
- return -EINVAL;
- }
- tmp = VIA_PITCH_ENABLE | (tmp >> 3) | (dst_pitch << (16 - 3));
- writel(tmp, engine + 0x38);
-
- if (op == VIA_BITBLT_FILL)
- ge_cmd |= fill_rop << 24 | 0x00002000 | 0x00000001;
- else {
- ge_cmd |= 0xCC000000; /* ROP=SRCCOPY */
- if (src_mem)
- ge_cmd |= 0x00000040;
- if (op == VIA_BITBLT_MONO)
- ge_cmd |= 0x00000002 | 0x00000100 | 0x00020000;
- else
- ge_cmd |= 0x00000001;
- }
- writel(ge_cmd, engine);
-
- if (op == VIA_BITBLT_FILL || !src_mem)
- return 0;
-
- tmp = (width * height * (op == VIA_BITBLT_MONO ? 1 : (dst_bpp >> 3)) +
- 3) >> 2;
-
- for (i = 0; i < tmp; i++)
- writel(src_mem[i], engine + VIA_MMIO_BLTBASE);
-
- return 0;
-}
-
-static int hw_bitblt_2(void __iomem *engine, u8 op, u32 width, u32 height,
- u8 dst_bpp, u32 dst_addr, u32 dst_pitch, u32 dst_x, u32 dst_y,
- u32 *src_mem, u32 src_addr, u32 src_pitch, u32 src_x, u32 src_y,
- u32 fg_color, u32 bg_color, u8 fill_rop)
-{
- u32 ge_cmd = 0, tmp, i;
- int ret;
-
- if (!op || op > 3) {
- printk(KERN_WARNING "hw_bitblt_2: Invalid operation: %d\n", op);
- return -EINVAL;
- }
-
- if (op != VIA_BITBLT_FILL && !src_mem && src_addr == dst_addr) {
- if (src_x < dst_x) {
- ge_cmd |= 0x00008000;
- src_x += width - 1;
- dst_x += width - 1;
- }
- if (src_y < dst_y) {
- ge_cmd |= 0x00004000;
- src_y += height - 1;
- dst_y += height - 1;
- }
- }
-
- if (op == VIA_BITBLT_FILL) {
- switch (fill_rop) {
- case 0x00: /* blackness */
- case 0x5A: /* pattern inversion */
- case 0xF0: /* pattern copy */
- case 0xFF: /* whiteness */
- break;
- default:
- printk(KERN_WARNING "hw_bitblt_2: Invalid fill rop: "
- "%u\n", fill_rop);
- return -EINVAL;
- }
- }
-
- ret = viafb_set_bpp(engine, dst_bpp);
- if (ret)
- return ret;
-
- if (op == VIA_BITBLT_FILL)
- tmp = 0;
- else
- tmp = src_pitch;
- if (tmp & 0xFFFFC007 || dst_pitch & 0xFFFFC007) {
- printk(KERN_WARNING "hw_bitblt_2: Unsupported pitch %X %X\n",
- tmp, dst_pitch);
- return -EINVAL;
- }
- tmp = (tmp >> 3) | (dst_pitch << (16 - 3));
- writel(tmp, engine + 0x08);
-
- if ((width - 1) & 0xFFFFF000 || (height - 1) & 0xFFFFF000) {
- printk(KERN_WARNING "hw_bitblt_2: Unsupported width/height "
- "%d %d\n", width, height);
- return -EINVAL;
- }
- tmp = (width - 1) | ((height - 1) << 16);
- writel(tmp, engine + 0x0C);
-
- if (dst_x & 0xFFFFF000 || dst_y & 0xFFFFF000) {
- printk(KERN_WARNING "hw_bitblt_2: Unsupported destination x/y "
- "%d %d\n", dst_x, dst_y);
- return -EINVAL;
- }
- tmp = dst_x | (dst_y << 16);
- writel(tmp, engine + 0x10);
-
- if (dst_addr & 0xE0000007) {
- printk(KERN_WARNING "hw_bitblt_2: Unsupported destination "
- "address %X\n", dst_addr);
- return -EINVAL;
- }
- tmp = dst_addr >> 3;
- writel(tmp, engine + 0x14);
-
- if (op != VIA_BITBLT_FILL) {
- if (src_x & (op == VIA_BITBLT_MONO ? 0xFFFF8000 : 0xFFFFF000)
- || src_y & 0xFFFFF000) {
- printk(KERN_WARNING "hw_bitblt_2: Unsupported source "
- "x/y %d %d\n", src_x, src_y);
- return -EINVAL;
- }
- tmp = src_x | (src_y << 16);
- writel(tmp, engine + 0x18);
-
- tmp = src_mem ? 0 : src_addr;
- if (dst_addr & 0xE0000007) {
- printk(KERN_WARNING "hw_bitblt_2: Unsupported source "
- "address %X\n", tmp);
- return -EINVAL;
- }
- tmp >>= 3;
- writel(tmp, engine + 0x1C);
- }
-
- if (op == VIA_BITBLT_FILL) {
- writel(fg_color, engine + 0x58);
- } else if (op == VIA_BITBLT_MONO) {
- writel(fg_color, engine + 0x4C);
- writel(bg_color, engine + 0x50);
- }
-
- if (op == VIA_BITBLT_FILL)
- ge_cmd |= fill_rop << 24 | 0x00002000 | 0x00000001;
- else {
- ge_cmd |= 0xCC000000; /* ROP=SRCCOPY */
- if (src_mem)
- ge_cmd |= 0x00000040;
- if (op == VIA_BITBLT_MONO)
- ge_cmd |= 0x00000002 | 0x00000100 | 0x00020000;
- else
- ge_cmd |= 0x00000001;
- }
- writel(ge_cmd, engine);
-
- if (op == VIA_BITBLT_FILL || !src_mem)
- return 0;
-
- tmp = (width * height * (op == VIA_BITBLT_MONO ? 1 : (dst_bpp >> 3)) +
- 3) >> 2;
-
- for (i = 0; i < tmp; i++)
- writel(src_mem[i], engine + VIA_MMIO_BLTBASE);
-
- return 0;
-}
-
-int viafb_setup_engine(struct fb_info *info)
-{
- struct viafb_par *viapar = info->par;
- void __iomem *engine;
- u32 chip_name = viapar->shared->chip_info.gfx_chip_name;
-
- engine = viapar->shared->vdev->engine_mmio;
- if (!engine) {
- printk(KERN_WARNING "viafb_init_accel: ioremap failed, "
- "hardware acceleration disabled\n");
- return -ENOMEM;
- }
-
- switch (chip_name) {
- case UNICHROME_CLE266:
- case UNICHROME_K400:
- case UNICHROME_K800:
- case UNICHROME_PM800:
- case UNICHROME_CN700:
- case UNICHROME_CX700:
- case UNICHROME_CN750:
- case UNICHROME_K8M890:
- case UNICHROME_P4M890:
- case UNICHROME_P4M900:
- viapar->shared->hw_bitblt = hw_bitblt_1;
- break;
- case UNICHROME_VX800:
- case UNICHROME_VX855:
- case UNICHROME_VX900:
- viapar->shared->hw_bitblt = hw_bitblt_2;
- break;
- default:
- viapar->shared->hw_bitblt = NULL;
- }
-
- viapar->fbmem_free -= CURSOR_SIZE;
- viapar->shared->cursor_vram_addr = viapar->fbmem_free;
- viapar->fbmem_used += CURSOR_SIZE;
-
- viapar->fbmem_free -= VQ_SIZE;
- viapar->shared->vq_vram_addr = viapar->fbmem_free;
- viapar->fbmem_used += VQ_SIZE;
-
-#if defined(CONFIG_VIDEO_VIA_CAMERA) || defined(CONFIG_VIDEO_VIA_CAMERA_MODULE)
- /*
- * Set aside a chunk of framebuffer memory for the camera
- * driver. Someday this driver probably needs a proper allocator
- * for fbmem; for now, we just have to do this before the
- * framebuffer initializes itself.
- *
- * As for the size: the engine can handle three frames,
- * 16 bits deep, up to VGA resolution.
- */
- viapar->shared->vdev->camera_fbmem_size = 3*VGA_HEIGHT*VGA_WIDTH*2;
- viapar->fbmem_free -= viapar->shared->vdev->camera_fbmem_size;
- viapar->fbmem_used += viapar->shared->vdev->camera_fbmem_size;
- viapar->shared->vdev->camera_fbmem_offset = viapar->fbmem_free;
-#endif
-
- viafb_reset_engine(viapar);
- return 0;
-}
-
-void viafb_reset_engine(struct viafb_par *viapar)
-{
- void __iomem *engine = viapar->shared->vdev->engine_mmio;
- int highest_reg, i;
- u32 vq_start_addr, vq_end_addr, vq_start_low, vq_end_low, vq_high,
- vq_len, chip_name = viapar->shared->chip_info.gfx_chip_name;
-
- /* Initialize registers to reset the 2D engine */
- switch (viapar->shared->chip_info.twod_engine) {
- case VIA_2D_ENG_M1:
- highest_reg = 0x5c;
- break;
- default:
- highest_reg = 0x40;
- break;
- }
- for (i = 0; i <= highest_reg; i += 4)
- writel(0x0, engine + i);
-
- /* Init AGP and VQ regs */
- switch (chip_name) {
- case UNICHROME_K8M890:
- case UNICHROME_P4M900:
- case UNICHROME_VX800:
- case UNICHROME_VX855:
- case UNICHROME_VX900:
- writel(0x00100000, engine + VIA_REG_CR_TRANSET);
- writel(0x680A0000, engine + VIA_REG_CR_TRANSPACE);
- writel(0x02000000, engine + VIA_REG_CR_TRANSPACE);
- break;
-
- default:
- writel(0x00100000, engine + VIA_REG_TRANSET);
- writel(0x00000000, engine + VIA_REG_TRANSPACE);
- writel(0x00333004, engine + VIA_REG_TRANSPACE);
- writel(0x60000000, engine + VIA_REG_TRANSPACE);
- writel(0x61000000, engine + VIA_REG_TRANSPACE);
- writel(0x62000000, engine + VIA_REG_TRANSPACE);
- writel(0x63000000, engine + VIA_REG_TRANSPACE);
- writel(0x64000000, engine + VIA_REG_TRANSPACE);
- writel(0x7D000000, engine + VIA_REG_TRANSPACE);
-
- writel(0xFE020000, engine + VIA_REG_TRANSET);
- writel(0x00000000, engine + VIA_REG_TRANSPACE);
- break;
- }
-
- /* Enable VQ */
- vq_start_addr = viapar->shared->vq_vram_addr;
- vq_end_addr = viapar->shared->vq_vram_addr + VQ_SIZE - 1;
-
- vq_start_low = 0x50000000 | (vq_start_addr & 0xFFFFFF);
- vq_end_low = 0x51000000 | (vq_end_addr & 0xFFFFFF);
- vq_high = 0x52000000 | ((vq_start_addr & 0xFF000000) >> 24) |
- ((vq_end_addr & 0xFF000000) >> 16);
- vq_len = 0x53000000 | (VQ_SIZE >> 3);
-
- switch (chip_name) {
- case UNICHROME_K8M890:
- case UNICHROME_P4M900:
- case UNICHROME_VX800:
- case UNICHROME_VX855:
- case UNICHROME_VX900:
- vq_start_low |= 0x20000000;
- vq_end_low |= 0x20000000;
- vq_high |= 0x20000000;
- vq_len |= 0x20000000;
-
- writel(0x00100000, engine + VIA_REG_CR_TRANSET);
- writel(vq_high, engine + VIA_REG_CR_TRANSPACE);
- writel(vq_start_low, engine + VIA_REG_CR_TRANSPACE);
- writel(vq_end_low, engine + VIA_REG_CR_TRANSPACE);
- writel(vq_len, engine + VIA_REG_CR_TRANSPACE);
- writel(0x74301001, engine + VIA_REG_CR_TRANSPACE);
- writel(0x00000000, engine + VIA_REG_CR_TRANSPACE);
- break;
- default:
- writel(0x00FE0000, engine + VIA_REG_TRANSET);
- writel(0x080003FE, engine + VIA_REG_TRANSPACE);
- writel(0x0A00027C, engine + VIA_REG_TRANSPACE);
- writel(0x0B000260, engine + VIA_REG_TRANSPACE);
- writel(0x0C000274, engine + VIA_REG_TRANSPACE);
- writel(0x0D000264, engine + VIA_REG_TRANSPACE);
- writel(0x0E000000, engine + VIA_REG_TRANSPACE);
- writel(0x0F000020, engine + VIA_REG_TRANSPACE);
- writel(0x1000027E, engine + VIA_REG_TRANSPACE);
- writel(0x110002FE, engine + VIA_REG_TRANSPACE);
- writel(0x200F0060, engine + VIA_REG_TRANSPACE);
-
- writel(0x00000006, engine + VIA_REG_TRANSPACE);
- writel(0x40008C0F, engine + VIA_REG_TRANSPACE);
- writel(0x44000000, engine + VIA_REG_TRANSPACE);
- writel(0x45080C04, engine + VIA_REG_TRANSPACE);
- writel(0x46800408, engine + VIA_REG_TRANSPACE);
-
- writel(vq_high, engine + VIA_REG_TRANSPACE);
- writel(vq_start_low, engine + VIA_REG_TRANSPACE);
- writel(vq_end_low, engine + VIA_REG_TRANSPACE);
- writel(vq_len, engine + VIA_REG_TRANSPACE);
- break;
- }
-
- /* Set Cursor Image Base Address */
- writel(viapar->shared->cursor_vram_addr, engine + VIA_REG_CURSOR_MODE);
- writel(0x0, engine + VIA_REG_CURSOR_POS);
- writel(0x0, engine + VIA_REG_CURSOR_ORG);
- writel(0x0, engine + VIA_REG_CURSOR_BG);
- writel(0x0, engine + VIA_REG_CURSOR_FG);
- return;
-}
-
-void viafb_show_hw_cursor(struct fb_info *info, int Status)
-{
- struct viafb_par *viapar = info->par;
- u32 temp, iga_path = viapar->iga_path;
-
- temp = readl(viapar->shared->vdev->engine_mmio + VIA_REG_CURSOR_MODE);
- switch (Status) {
- case HW_Cursor_ON:
- temp |= 0x1;
- break;
- case HW_Cursor_OFF:
- temp &= 0xFFFFFFFE;
- break;
- }
- switch (iga_path) {
- case IGA2:
- temp |= 0x80000000;
- break;
- case IGA1:
- default:
- temp &= 0x7FFFFFFF;
- }
- writel(temp, viapar->shared->vdev->engine_mmio + VIA_REG_CURSOR_MODE);
-}
-
-void viafb_wait_engine_idle(struct fb_info *info)
-{
- struct viafb_par *viapar = info->par;
- int loop = 0;
- u32 mask;
- void __iomem *engine = viapar->shared->vdev->engine_mmio;
-
- switch (viapar->shared->chip_info.twod_engine) {
- case VIA_2D_ENG_H5:
- case VIA_2D_ENG_M1:
- mask = VIA_CMD_RGTR_BUSY_M1 | VIA_2D_ENG_BUSY_M1 |
- VIA_3D_ENG_BUSY_M1;
- break;
- default:
- while (!(readl(engine + VIA_REG_STATUS) &
- VIA_VR_QUEUE_BUSY) && (loop < MAXLOOP)) {
- loop++;
- cpu_relax();
- }
- mask = VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | VIA_3D_ENG_BUSY;
- break;
- }
-
- while ((readl(engine + VIA_REG_STATUS) & mask) && (loop < MAXLOOP)) {
- loop++;
- cpu_relax();
- }
-
- if (loop >= MAXLOOP)
- printk(KERN_ERR "viafb_wait_engine_idle: not syncing\n");
-}
diff --git a/drivers/video/via/accel.h b/drivers/video/via/accel.h
deleted file mode 100644
index 79d5e10cc835..000000000000
--- a/drivers/video/via/accel.h
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __ACCEL_H__
-#define __ACCEL_H__
-
-#define FB_ACCEL_VIA_UNICHROME 50
-
-/* MMIO Base Address Definition */
-#define MMIO_VGABASE 0x8000
-#define MMIO_CR_READ (MMIO_VGABASE + 0x3D4)
-#define MMIO_CR_WRITE (MMIO_VGABASE + 0x3D5)
-#define MMIO_SR_READ (MMIO_VGABASE + 0x3C4)
-#define MMIO_SR_WRITE (MMIO_VGABASE + 0x3C5)
-
-/* HW Cursor Status Define */
-#define HW_Cursor_ON 0
-#define HW_Cursor_OFF 1
-
-#define CURSOR_SIZE (8 * 1024)
-#define VQ_SIZE (256 * 1024)
-
-#define VIA_MMIO_BLTBASE 0x200000
-#define VIA_MMIO_BLTSIZE 0x200000
-
-/* Defines for 2D registers */
-#define VIA_REG_GECMD 0x000
-#define VIA_REG_GEMODE 0x004
-#define VIA_REG_SRCPOS 0x008
-#define VIA_REG_DSTPOS 0x00C
-/* width and height */
-#define VIA_REG_DIMENSION 0x010
-#define VIA_REG_PATADDR 0x014
-#define VIA_REG_FGCOLOR 0x018
-#define VIA_REG_BGCOLOR 0x01C
-/* top and left of clipping */
-#define VIA_REG_CLIPTL 0x020
-/* bottom and right of clipping */
-#define VIA_REG_CLIPBR 0x024
-#define VIA_REG_OFFSET 0x028
-/* color key control */
-#define VIA_REG_KEYCONTROL 0x02C
-#define VIA_REG_SRCBASE 0x030
-#define VIA_REG_DSTBASE 0x034
-/* pitch of src and dst */
-#define VIA_REG_PITCH 0x038
-#define VIA_REG_MONOPAT0 0x03C
-#define VIA_REG_MONOPAT1 0x040
-/* from 0x100 to 0x1ff */
-#define VIA_REG_COLORPAT 0x100
-
-/* defines for VIA 2D registers for vt3353/3409 (M1 engine)*/
-#define VIA_REG_GECMD_M1 0x000
-#define VIA_REG_GEMODE_M1 0x004
-#define VIA_REG_GESTATUS_M1 0x004 /* as same as VIA_REG_GEMODE */
-#define VIA_REG_PITCH_M1 0x008 /* pitch of src and dst */
-#define VIA_REG_DIMENSION_M1 0x00C /* width and height */
-#define VIA_REG_DSTPOS_M1 0x010
-#define VIA_REG_LINE_XY_M1 0x010
-#define VIA_REG_DSTBASE_M1 0x014
-#define VIA_REG_SRCPOS_M1 0x018
-#define VIA_REG_LINE_K1K2_M1 0x018
-#define VIA_REG_SRCBASE_M1 0x01C
-#define VIA_REG_PATADDR_M1 0x020
-#define VIA_REG_MONOPAT0_M1 0x024
-#define VIA_REG_MONOPAT1_M1 0x028
-#define VIA_REG_OFFSET_M1 0x02C
-#define VIA_REG_LINE_ERROR_M1 0x02C
-#define VIA_REG_CLIPTL_M1 0x040 /* top and left of clipping */
-#define VIA_REG_CLIPBR_M1 0x044 /* bottom and right of clipping */
-#define VIA_REG_KEYCONTROL_M1 0x048 /* color key control */
-#define VIA_REG_FGCOLOR_M1 0x04C
-#define VIA_REG_DSTCOLORKEY_M1 0x04C /* as same as VIA_REG_FG */
-#define VIA_REG_BGCOLOR_M1 0x050
-#define VIA_REG_SRCCOLORKEY_M1 0x050 /* as same as VIA_REG_BG */
-#define VIA_REG_MONOPATFGC_M1 0x058 /* Add BG color of Pattern. */
-#define VIA_REG_MONOPATBGC_M1 0x05C /* Add FG color of Pattern. */
-#define VIA_REG_COLORPAT_M1 0x100 /* from 0x100 to 0x1ff */
-
-/* VIA_REG_PITCH(0x38): Pitch Setting */
-#define VIA_PITCH_ENABLE 0x80000000
-
-/* defines for VIA HW cursor registers */
-#define VIA_REG_CURSOR_MODE 0x2D0
-#define VIA_REG_CURSOR_POS 0x2D4
-#define VIA_REG_CURSOR_ORG 0x2D8
-#define VIA_REG_CURSOR_BG 0x2DC
-#define VIA_REG_CURSOR_FG 0x2E0
-
-/* VIA_REG_GEMODE(0x04): GE mode */
-#define VIA_GEM_8bpp 0x00000000
-#define VIA_GEM_16bpp 0x00000100
-#define VIA_GEM_32bpp 0x00000300
-
-/* VIA_REG_GECMD(0x00): 2D Engine Command */
-#define VIA_GEC_NOOP 0x00000000
-#define VIA_GEC_BLT 0x00000001
-#define VIA_GEC_LINE 0x00000005
-
-/* Rotate Command */
-#define VIA_GEC_ROT 0x00000008
-
-#define VIA_GEC_SRC_XY 0x00000000
-#define VIA_GEC_SRC_LINEAR 0x00000010
-#define VIA_GEC_DST_XY 0x00000000
-#define VIA_GEC_DST_LINRAT 0x00000020
-
-#define VIA_GEC_SRC_FB 0x00000000
-#define VIA_GEC_SRC_SYS 0x00000040
-#define VIA_GEC_DST_FB 0x00000000
-#define VIA_GEC_DST_SYS 0x00000080
-
-/* source is mono */
-#define VIA_GEC_SRC_MONO 0x00000100
-/* pattern is mono */
-#define VIA_GEC_PAT_MONO 0x00000200
-/* mono src is opaque */
-#define VIA_GEC_MSRC_OPAQUE 0x00000000
-/* mono src is transparent */
-#define VIA_GEC_MSRC_TRANS 0x00000400
-/* pattern is in frame buffer */
-#define VIA_GEC_PAT_FB 0x00000000
-/* pattern is from reg setting */
-#define VIA_GEC_PAT_REG 0x00000800
-
-#define VIA_GEC_CLIP_DISABLE 0x00000000
-#define VIA_GEC_CLIP_ENABLE 0x00001000
-
-#define VIA_GEC_FIXCOLOR_PAT 0x00002000
-
-#define VIA_GEC_INCX 0x00000000
-#define VIA_GEC_DECY 0x00004000
-#define VIA_GEC_INCY 0x00000000
-#define VIA_GEC_DECX 0x00008000
-/* mono pattern is opaque */
-#define VIA_GEC_MPAT_OPAQUE 0x00000000
-/* mono pattern is transparent */
-#define VIA_GEC_MPAT_TRANS 0x00010000
-
-#define VIA_GEC_MONO_UNPACK 0x00000000
-#define VIA_GEC_MONO_PACK 0x00020000
-#define VIA_GEC_MONO_DWORD 0x00000000
-#define VIA_GEC_MONO_WORD 0x00040000
-#define VIA_GEC_MONO_BYTE 0x00080000
-
-#define VIA_GEC_LASTPIXEL_ON 0x00000000
-#define VIA_GEC_LASTPIXEL_OFF 0x00100000
-#define VIA_GEC_X_MAJOR 0x00000000
-#define VIA_GEC_Y_MAJOR 0x00200000
-#define VIA_GEC_QUICK_START 0x00800000
-
-/* defines for VIA 3D registers */
-#define VIA_REG_STATUS 0x400
-#define VIA_REG_CR_TRANSET 0x41C
-#define VIA_REG_CR_TRANSPACE 0x420
-#define VIA_REG_TRANSET 0x43C
-#define VIA_REG_TRANSPACE 0x440
-
-/* VIA_REG_STATUS(0x400): Engine Status */
-
-/* Command Regulator is busy */
-#define VIA_CMD_RGTR_BUSY 0x00000080
-/* 2D Engine is busy */
-#define VIA_2D_ENG_BUSY 0x00000002
-/* 3D Engine is busy */
-#define VIA_3D_ENG_BUSY 0x00000001
-/* Virtual Queue is busy */
-#define VIA_VR_QUEUE_BUSY 0x00020000
-
-/* VIA_REG_STATUS(0x400): Engine Status for H5 */
-#define VIA_CMD_RGTR_BUSY_H5 0x00000010 /* Command Regulator is busy */
-#define VIA_2D_ENG_BUSY_H5 0x00000002 /* 2D Engine is busy */
-#define VIA_3D_ENG_BUSY_H5 0x00001FE1 /* 3D Engine is busy */
-#define VIA_VR_QUEUE_BUSY_H5 0x00000004 /* Virtual Queue is busy */
-
-/* VIA_REG_STATUS(0x400): Engine Status for VT3353/3409 */
-#define VIA_CMD_RGTR_BUSY_M1 0x00000010 /* Command Regulator is busy */
-#define VIA_2D_ENG_BUSY_M1 0x00000002 /* 2D Engine is busy */
-#define VIA_3D_ENG_BUSY_M1 0x00001FE1 /* 3D Engine is busy */
-#define VIA_VR_QUEUE_BUSY_M1 0x00000004 /* Virtual Queue is busy */
-
-#define MAXLOOP 0xFFFFFF
-
-#define VIA_BITBLT_COLOR 1
-#define VIA_BITBLT_MONO 2
-#define VIA_BITBLT_FILL 3
-
-int viafb_setup_engine(struct fb_info *info);
-void viafb_reset_engine(struct viafb_par *viapar);
-void viafb_show_hw_cursor(struct fb_info *info, int Status);
-void viafb_wait_engine_idle(struct fb_info *info);
-
-#endif /* __ACCEL_H__ */
diff --git a/drivers/video/via/chip.h b/drivers/video/via/chip.h
deleted file mode 100644
index d32a5076c20f..000000000000
--- a/drivers/video/via/chip.h
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-#ifndef __CHIP_H__
-#define __CHIP_H__
-
-#include "global.h"
-
-/***************************************/
-/* Definition Graphic Chip Information */
-/***************************************/
-
-#define PCI_VIA_VENDOR_ID 0x1106
-
-/* Define VIA Graphic Chip Name */
-#define UNICHROME_CLE266 1
-#define UNICHROME_CLE266_DID 0x3122
-#define CLE266_REVISION_AX 0x0A
-#define CLE266_REVISION_CX 0x0C
-
-#define UNICHROME_K400 2
-#define UNICHROME_K400_DID 0x7205
-
-#define UNICHROME_K800 3
-#define UNICHROME_K800_DID 0x3108
-
-#define UNICHROME_PM800 4
-#define UNICHROME_PM800_DID 0x3118
-
-#define UNICHROME_CN700 5
-#define UNICHROME_CN700_DID 0x3344
-
-#define UNICHROME_CX700 6
-#define UNICHROME_CX700_DID 0x3157
-#define CX700_REVISION_700 0x0
-#define CX700_REVISION_700M 0x1
-#define CX700_REVISION_700M2 0x2
-
-#define UNICHROME_CN750 7
-#define UNICHROME_CN750_DID 0x3225
-
-#define UNICHROME_K8M890 8
-#define UNICHROME_K8M890_DID 0x3230
-
-#define UNICHROME_P4M890 9
-#define UNICHROME_P4M890_DID 0x3343
-
-#define UNICHROME_P4M900 10
-#define UNICHROME_P4M900_DID 0x3371
-
-#define UNICHROME_VX800 11
-#define UNICHROME_VX800_DID 0x1122
-
-#define UNICHROME_VX855 12
-#define UNICHROME_VX855_DID 0x5122
-
-#define UNICHROME_VX900 13
-#define UNICHROME_VX900_DID 0x7122
-
-/**************************************************/
-/* Definition TMDS Trasmitter Information */
-/**************************************************/
-
-/* Definition TMDS Trasmitter Index */
-#define NON_TMDS_TRANSMITTER 0x00
-#define VT1632_TMDS 0x01
-#define INTEGRATED_TMDS 0x42
-
-/* Definition TMDS Trasmitter I2C Slave Address */
-#define VT1632_TMDS_I2C_ADDR 0x10
-
-/**************************************************/
-/* Definition LVDS Trasmitter Information */
-/**************************************************/
-
-/* Definition LVDS Trasmitter Index */
-#define NON_LVDS_TRANSMITTER 0x00
-#define VT1631_LVDS 0x01
-#define VT1636_LVDS 0x0E
-#define INTEGRATED_LVDS 0x41
-
-/* Definition Digital Transmitter Mode */
-#define TX_DATA_12_BITS 0x01
-#define TX_DATA_24_BITS 0x02
-#define TX_DATA_DDR_MODE 0x04
-#define TX_DATA_SDR_MODE 0x08
-
-/* Definition LVDS Trasmitter I2C Slave Address */
-#define VT1631_LVDS_I2C_ADDR 0x70
-#define VT3271_LVDS_I2C_ADDR 0x80
-#define VT1636_LVDS_I2C_ADDR 0x80
-
-struct tmds_chip_information {
- int tmds_chip_name;
- int tmds_chip_slave_addr;
- int output_interface;
- int i2c_port;
-};
-
-struct lvds_chip_information {
- int lvds_chip_name;
- int lvds_chip_slave_addr;
- int output_interface;
- int i2c_port;
-};
-
-/* The type of 2D engine */
-enum via_2d_engine {
- VIA_2D_ENG_H2,
- VIA_2D_ENG_H5,
- VIA_2D_ENG_M1,
-};
-
-struct chip_information {
- int gfx_chip_name;
- int gfx_chip_revision;
- enum via_2d_engine twod_engine;
- struct tmds_chip_information tmds_chip_info;
- struct lvds_chip_information lvds_chip_info;
- struct lvds_chip_information lvds_chip_info2;
-};
-
-struct tmds_setting_information {
- int iga_path;
- int h_active;
- int v_active;
- int max_pixel_clock;
-};
-
-struct lvds_setting_information {
- int iga_path;
- int lcd_panel_hres;
- int lcd_panel_vres;
- int display_method;
- int device_lcd_dualedge;
- int LCDDithering;
- int lcd_mode;
- u32 vclk; /*panel mode clock value */
-};
-
-struct GFX_DPA_SETTING {
- int ClkRangeIndex;
- u8 DVP0; /* CR96[3:0] */
- u8 DVP0DataDri_S1; /* SR2A[5] */
- u8 DVP0DataDri_S; /* SR1B[1] */
- u8 DVP0ClockDri_S1; /* SR2A[4] */
- u8 DVP0ClockDri_S; /* SR1E[2] */
- u8 DVP1; /* CR9B[3:0] */
- u8 DVP1Driving; /* SR65[3:0], Data and Clock driving */
- u8 DFPHigh; /* CR97[3:0] */
- u8 DFPLow; /* CR99[3:0] */
-
-};
-
-struct VT1636_DPA_SETTING {
- u8 CLK_SEL_ST1;
- u8 CLK_SEL_ST2;
-};
-#endif /* __CHIP_H__ */
diff --git a/drivers/video/via/debug.h b/drivers/video/via/debug.h
deleted file mode 100644
index 86eacc2017f3..000000000000
--- a/drivers/video/via/debug.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-#ifndef __DEBUG_H__
-#define __DEBUG_H__
-
-#ifndef VIAFB_DEBUG
-#define VIAFB_DEBUG 0
-#endif
-
-#if VIAFB_DEBUG
-#define DEBUG_MSG(f, a...) printk(f, ## a)
-#else
-#define DEBUG_MSG(f, a...)
-#endif
-
-#define VIAFB_WARN 0
-#if VIAFB_WARN
-#define WARN_MSG(f, a...) printk(f, ## a)
-#else
-#define WARN_MSG(f, a...)
-#endif
-
-#endif /* __DEBUG_H__ */
diff --git a/drivers/video/via/dvi.c b/drivers/video/via/dvi.c
deleted file mode 100644
index 7789553952d3..000000000000
--- a/drivers/video/via/dvi.c
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-#include <linux/via-core.h>
-#include <linux/via_i2c.h>
-#include "global.h"
-
-static void tmds_register_write(int index, u8 data);
-static int tmds_register_read(int index);
-static int tmds_register_read_bytes(int index, u8 *buff, int buff_len);
-static void dvi_get_panel_size_from_DDCv1(
- struct tmds_chip_information *tmds_chip,
- struct tmds_setting_information *tmds_setting);
-static int viafb_dvi_query_EDID(void);
-
-static inline bool check_tmds_chip(int device_id_subaddr, int device_id)
-{
- return tmds_register_read(device_id_subaddr) == device_id;
-}
-
-void viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
- struct tmds_setting_information *tmds_setting)
-{
- DEBUG_MSG(KERN_INFO "viafb_init_dvi_size()\n");
-
- viafb_dvi_sense();
- if (viafb_dvi_query_EDID() == 1)
- dvi_get_panel_size_from_DDCv1(tmds_chip, tmds_setting);
-
- return;
-}
-
-bool viafb_tmds_trasmitter_identify(void)
-{
- unsigned char sr2a = 0, sr1e = 0, sr3e = 0;
-
- /* Turn on ouputting pad */
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_K8M890:
- /*=* DFP Low Pad on *=*/
- sr2a = viafb_read_reg(VIASR, SR2A);
- viafb_write_reg_mask(SR2A, VIASR, 0x03, BIT0 + BIT1);
- break;
-
- case UNICHROME_P4M900:
- case UNICHROME_P4M890:
- /* DFP Low Pad on */
- sr2a = viafb_read_reg(VIASR, SR2A);
- viafb_write_reg_mask(SR2A, VIASR, 0x03, BIT0 + BIT1);
- /* DVP0 Pad on */
- sr1e = viafb_read_reg(VIASR, SR1E);
- viafb_write_reg_mask(SR1E, VIASR, 0xC0, BIT6 + BIT7);
- break;
-
- default:
- /* DVP0/DVP1 Pad on */
- sr1e = viafb_read_reg(VIASR, SR1E);
- viafb_write_reg_mask(SR1E, VIASR, 0xF0, BIT4 +
- BIT5 + BIT6 + BIT7);
- /* SR3E[1]Multi-function selection:
- 0 = Emulate I2C and DDC bus by GPIO2/3/4. */
- sr3e = viafb_read_reg(VIASR, SR3E);
- viafb_write_reg_mask(SR3E, VIASR, 0x0, BIT5);
- break;
- }
-
- /* Check for VT1632: */
- viaparinfo->chip_info->tmds_chip_info.tmds_chip_name = VT1632_TMDS;
- viaparinfo->chip_info->
- tmds_chip_info.tmds_chip_slave_addr = VT1632_TMDS_I2C_ADDR;
- viaparinfo->chip_info->tmds_chip_info.i2c_port = VIA_PORT_31;
- if (check_tmds_chip(VT1632_DEVICE_ID_REG, VT1632_DEVICE_ID)) {
- /*
- * Currently only support 12bits,dual edge,add 24bits mode later
- */
- tmds_register_write(0x08, 0x3b);
-
- DEBUG_MSG(KERN_INFO "\n VT1632 TMDS ! \n");
- DEBUG_MSG(KERN_INFO "\n %2d",
- viaparinfo->chip_info->tmds_chip_info.tmds_chip_name);
- DEBUG_MSG(KERN_INFO "\n %2d",
- viaparinfo->chip_info->tmds_chip_info.i2c_port);
- return true;
- } else {
- viaparinfo->chip_info->tmds_chip_info.i2c_port = VIA_PORT_2C;
- if (check_tmds_chip(VT1632_DEVICE_ID_REG, VT1632_DEVICE_ID)) {
- tmds_register_write(0x08, 0x3b);
- DEBUG_MSG(KERN_INFO "\n VT1632 TMDS ! \n");
- DEBUG_MSG(KERN_INFO "\n %2d",
- viaparinfo->chip_info->
- tmds_chip_info.tmds_chip_name);
- DEBUG_MSG(KERN_INFO "\n %2d",
- viaparinfo->chip_info->
- tmds_chip_info.i2c_port);
- return true;
- }
- }
-
- viaparinfo->chip_info->tmds_chip_info.tmds_chip_name = INTEGRATED_TMDS;
-
- if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) &&
- ((viafb_display_hardware_layout == HW_LAYOUT_DVI_ONLY) ||
- (viafb_display_hardware_layout == HW_LAYOUT_LCD_DVI))) {
- DEBUG_MSG(KERN_INFO "\n Integrated TMDS ! \n");
- return true;
- }
-
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_K8M890:
- viafb_write_reg(SR2A, VIASR, sr2a);
- break;
-
- case UNICHROME_P4M900:
- case UNICHROME_P4M890:
- viafb_write_reg(SR2A, VIASR, sr2a);
- viafb_write_reg(SR1E, VIASR, sr1e);
- break;
-
- default:
- viafb_write_reg(SR1E, VIASR, sr1e);
- viafb_write_reg(SR3E, VIASR, sr3e);
- break;
- }
-
- viaparinfo->chip_info->
- tmds_chip_info.tmds_chip_name = NON_TMDS_TRANSMITTER;
- viaparinfo->chip_info->tmds_chip_info.
- tmds_chip_slave_addr = VT1632_TMDS_I2C_ADDR;
- return false;
-}
-
-static void tmds_register_write(int index, u8 data)
-{
- viafb_i2c_writebyte(viaparinfo->chip_info->tmds_chip_info.i2c_port,
- viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr,
- index, data);
-}
-
-static int tmds_register_read(int index)
-{
- u8 data;
-
- viafb_i2c_readbyte(viaparinfo->chip_info->tmds_chip_info.i2c_port,
- (u8) viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr,
- (u8) index, &data);
- return data;
-}
-
-static int tmds_register_read_bytes(int index, u8 *buff, int buff_len)
-{
- viafb_i2c_readbytes(viaparinfo->chip_info->tmds_chip_info.i2c_port,
- (u8) viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr,
- (u8) index, buff, buff_len);
- return 0;
-}
-
-/* DVI Set Mode */
-void viafb_dvi_set_mode(const struct fb_var_screeninfo *var,
- u16 cxres, u16 cyres, int iga)
-{
- struct fb_var_screeninfo dvi_var = *var;
- const struct fb_videomode *rb_mode;
- int maxPixelClock;
-
- maxPixelClock = viaparinfo->shared->tmds_setting_info.max_pixel_clock;
- if (maxPixelClock && PICOS2KHZ(var->pixclock) / 1000 > maxPixelClock) {
- rb_mode = viafb_get_best_rb_mode(var->xres, var->yres, 60);
- if (rb_mode)
- viafb_fill_var_timing_info(&dvi_var, rb_mode);
- }
-
- viafb_fill_crtc_timing(&dvi_var, cxres, cyres, iga);
-}
-
-/* Sense DVI Connector */
-int viafb_dvi_sense(void)
-{
- u8 RegSR1E = 0, RegSR3E = 0, RegCR6B = 0, RegCR91 = 0,
- RegCR93 = 0, RegCR9B = 0, data;
- int ret = false;
-
- DEBUG_MSG(KERN_INFO "viafb_dvi_sense!!\n");
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
- /* DI1 Pad on */
- RegSR1E = viafb_read_reg(VIASR, SR1E);
- viafb_write_reg(SR1E, VIASR, RegSR1E | 0x30);
-
- /* CR6B[0]VCK Input Selection: 1 = External clock. */
- RegCR6B = viafb_read_reg(VIACR, CR6B);
- viafb_write_reg(CR6B, VIACR, RegCR6B | 0x08);
-
- /* CR91[4] VDD On [3] Data On [2] VEE On [1] Back Light Off
- [0] Software Control Power Sequence */
- RegCR91 = viafb_read_reg(VIACR, CR91);
- viafb_write_reg(CR91, VIACR, 0x1D);
-
- /* CR93[7] DI1 Data Source Selection: 1 = DSP2.
- CR93[5] DI1 Clock Source: 1 = internal.
- CR93[4] DI1 Clock Polarity.
- CR93[3:1] DI1 Clock Adjust. CR93[0] DI1 enable */
- RegCR93 = viafb_read_reg(VIACR, CR93);
- viafb_write_reg(CR93, VIACR, 0x01);
- } else {
- /* DVP0/DVP1 Pad on */
- RegSR1E = viafb_read_reg(VIASR, SR1E);
- viafb_write_reg(SR1E, VIASR, RegSR1E | 0xF0);
-
- /* SR3E[1]Multi-function selection:
- 0 = Emulate I2C and DDC bus by GPIO2/3/4. */
- RegSR3E = viafb_read_reg(VIASR, SR3E);
- viafb_write_reg(SR3E, VIASR, RegSR3E & (~0x20));
-
- /* CR91[4] VDD On [3] Data On [2] VEE On [1] Back Light Off
- [0] Software Control Power Sequence */
- RegCR91 = viafb_read_reg(VIACR, CR91);
- viafb_write_reg(CR91, VIACR, 0x1D);
-
- /*CR9B[4] DVP1 Data Source Selection: 1 = From secondary
- display.CR9B[2:0] DVP1 Clock Adjust */
- RegCR9B = viafb_read_reg(VIACR, CR9B);
- viafb_write_reg(CR9B, VIACR, 0x01);
- }
-
- data = (u8) tmds_register_read(0x09);
- if (data & 0x04)
- ret = true;
-
- if (ret == false) {
- if (viafb_dvi_query_EDID())
- ret = true;
- }
-
- /* Restore status */
- viafb_write_reg(SR1E, VIASR, RegSR1E);
- viafb_write_reg(CR91, VIACR, RegCR91);
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
- viafb_write_reg(CR6B, VIACR, RegCR6B);
- viafb_write_reg(CR93, VIACR, RegCR93);
- } else {
- viafb_write_reg(SR3E, VIASR, RegSR3E);
- viafb_write_reg(CR9B, VIACR, RegCR9B);
- }
-
- return ret;
-}
-
-/* Query Flat Panel's EDID Table Version Through DVI Connector */
-static int viafb_dvi_query_EDID(void)
-{
- u8 data0, data1;
- int restore;
-
- DEBUG_MSG(KERN_INFO "viafb_dvi_query_EDID!!\n");
-
- restore = viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr;
- viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = 0xA0;
-
- data0 = (u8) tmds_register_read(0x00);
- data1 = (u8) tmds_register_read(0x01);
- if ((data0 == 0) && (data1 == 0xFF)) {
- viaparinfo->chip_info->
- tmds_chip_info.tmds_chip_slave_addr = restore;
- return EDID_VERSION_1; /* Found EDID1 Table */
- }
-
- return false;
-}
-
-/* Get Panel Size Using EDID1 Table */
-static void dvi_get_panel_size_from_DDCv1(
- struct tmds_chip_information *tmds_chip,
- struct tmds_setting_information *tmds_setting)
-{
- int i, restore;
- unsigned char EDID_DATA[18];
-
- DEBUG_MSG(KERN_INFO "\n dvi_get_panel_size_from_DDCv1 \n");
-
- restore = tmds_chip->tmds_chip_slave_addr;
- tmds_chip->tmds_chip_slave_addr = 0xA0;
- for (i = 0x25; i < 0x6D; i++) {
- switch (i) {
- case 0x36:
- case 0x48:
- case 0x5A:
- case 0x6C:
- tmds_register_read_bytes(i, EDID_DATA, 10);
- if (!(EDID_DATA[0] || EDID_DATA[1])) {
- /* The first two byte must be zero. */
- if (EDID_DATA[3] == 0xFD) {
- /* To get max pixel clock. */
- tmds_setting->max_pixel_clock =
- EDID_DATA[9] * 10;
- }
- }
- break;
-
- default:
- break;
- }
- }
-
- DEBUG_MSG(KERN_INFO "DVI max pixelclock = %d\n",
- tmds_setting->max_pixel_clock);
- tmds_chip->tmds_chip_slave_addr = restore;
-}
-
-/* If Disable DVI, turn off pad */
-void viafb_dvi_disable(void)
-{
- if (viaparinfo->chip_info->
- tmds_chip_info.output_interface == INTERFACE_TMDS)
- /* Turn off TMDS power. */
- viafb_write_reg(CRD2, VIACR,
- viafb_read_reg(VIACR, CRD2) | 0x08);
-}
-
-static void dvi_patch_skew_dvp0(void)
-{
- /* Reset data driving first: */
- viafb_write_reg_mask(SR1B, VIASR, 0, BIT1);
- viafb_write_reg_mask(SR2A, VIASR, 0, BIT4);
-
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_P4M890:
- {
- if ((viaparinfo->tmds_setting_info->h_active == 1600) &&
- (viaparinfo->tmds_setting_info->v_active ==
- 1200))
- viafb_write_reg_mask(CR96, VIACR, 0x03,
- BIT0 + BIT1 + BIT2);
- else
- viafb_write_reg_mask(CR96, VIACR, 0x07,
- BIT0 + BIT1 + BIT2);
- break;
- }
-
- case UNICHROME_P4M900:
- {
- viafb_write_reg_mask(CR96, VIACR, 0x07,
- BIT0 + BIT1 + BIT2 + BIT3);
- viafb_write_reg_mask(SR1B, VIASR, 0x02, BIT1);
- viafb_write_reg_mask(SR2A, VIASR, 0x10, BIT4);
- break;
- }
-
- default:
- {
- break;
- }
- }
-}
-
-static void dvi_patch_skew_dvp_low(void)
-{
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_K8M890:
- {
- viafb_write_reg_mask(CR99, VIACR, 0x03, BIT0 + BIT1);
- break;
- }
-
- case UNICHROME_P4M900:
- {
- viafb_write_reg_mask(CR99, VIACR, 0x08,
- BIT0 + BIT1 + BIT2 + BIT3);
- break;
- }
-
- case UNICHROME_P4M890:
- {
- viafb_write_reg_mask(CR99, VIACR, 0x0F,
- BIT0 + BIT1 + BIT2 + BIT3);
- break;
- }
-
- default:
- {
- break;
- }
- }
-}
-
-/* If Enable DVI, turn off pad */
-void viafb_dvi_enable(void)
-{
- u8 data;
-
- switch (viaparinfo->chip_info->tmds_chip_info.output_interface) {
- case INTERFACE_DVP0:
- viafb_write_reg_mask(CR6B, VIACR, 0x01, BIT0);
- viafb_write_reg_mask(CR6C, VIACR, 0x21, BIT0 + BIT5);
- dvi_patch_skew_dvp0();
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
- tmds_register_write(0x88, 0x3b);
- else
- /*clear CR91[5] to direct on display period
- in the secondary diplay path */
- via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
- break;
-
- case INTERFACE_DVP1:
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
- viafb_write_reg_mask(CR93, VIACR, 0x21, BIT0 + BIT5);
-
- /*fix dvi cann't be enabled with MB VT5718C4 - Al Zhang */
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
- tmds_register_write(0x88, 0x3b);
- else
- /*clear CR91[5] to direct on display period
- in the secondary diplay path */
- via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
-
- /*fix DVI cannot enable on EPIA-M board */
- if (viafb_platform_epia_dvi == 1) {
- viafb_write_reg_mask(CR91, VIACR, 0x1f, 0x1f);
- viafb_write_reg_mask(CR88, VIACR, 0x00, BIT6 + BIT0);
- if (viafb_bus_width == 24) {
- if (viafb_device_lcd_dualedge == 1)
- data = 0x3F;
- else
- data = 0x37;
- viafb_i2c_writebyte(viaparinfo->chip_info->
- tmds_chip_info.i2c_port,
- viaparinfo->chip_info->
- tmds_chip_info.tmds_chip_slave_addr,
- 0x08, data);
- }
- }
- break;
-
- case INTERFACE_DFP_HIGH:
- if (viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266)
- via_write_reg_mask(VIACR, CR97, 0x03, 0x03);
-
- via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
- break;
-
- case INTERFACE_DFP_LOW:
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
- break;
-
- dvi_patch_skew_dvp_low();
- via_write_reg_mask(VIACR, 0x91, 0x00, 0x20);
- break;
-
- case INTERFACE_TMDS:
- /* Turn on Display period in the panel path. */
- viafb_write_reg_mask(CR91, VIACR, 0, BIT7);
-
- /* Turn on TMDS power. */
- viafb_write_reg_mask(CRD2, VIACR, 0, BIT3);
- break;
- }
-
- if (viaparinfo->tmds_setting_info->iga_path == IGA2) {
- /* Disable LCD Scaling */
- viafb_write_reg_mask(CR79, VIACR, 0x00, BIT0);
- }
-}
diff --git a/drivers/video/via/dvi.h b/drivers/video/via/dvi.h
deleted file mode 100644
index 4c6bfba57d11..000000000000
--- a/drivers/video/via/dvi.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __DVI_H__
-#define __DVI_H__
-
-/*Definition TMDS Device ID register*/
-#define VT1632_DEVICE_ID_REG 0x02
-#define VT1632_DEVICE_ID 0x92
-
-#define GET_DVI_SIZE_BY_SYSTEM_BIOS 0x01
-#define GET_DVI_SIZE_BY_VGA_BIOS 0x02
-#define GET_DVI_SZIE_BY_HW_STRAPPING 0x03
-
-/* Definition DVI Panel ID*/
-/* Resolution: 640x480, Channel: single, Dithering: Enable */
-#define DVI_PANEL_ID0_640X480 0x00
-/* Resolution: 800x600, Channel: single, Dithering: Enable */
-#define DVI_PANEL_ID1_800x600 0x01
-/* Resolution: 1024x768, Channel: single, Dithering: Enable */
-#define DVI_PANEL_ID1_1024x768 0x02
-/* Resolution: 1280x768, Channel: single, Dithering: Enable */
-#define DVI_PANEL_ID1_1280x768 0x03
-/* Resolution: 1280x1024, Channel: dual, Dithering: Enable */
-#define DVI_PANEL_ID1_1280x1024 0x04
-/* Resolution: 1400x1050, Channel: dual, Dithering: Enable */
-#define DVI_PANEL_ID1_1400x1050 0x05
-/* Resolution: 1600x1200, Channel: dual, Dithering: Enable */
-#define DVI_PANEL_ID1_1600x1200 0x06
-
-/* Define the version of EDID*/
-#define EDID_VERSION_1 1
-#define EDID_VERSION_2 2
-
-#define DEV_CONNECT_DVI 0x01
-#define DEV_CONNECT_HDMI 0x02
-
-int viafb_dvi_sense(void);
-void viafb_dvi_disable(void);
-void viafb_dvi_enable(void);
-bool viafb_tmds_trasmitter_identify(void);
-void viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
- struct tmds_setting_information *tmds_setting);
-void viafb_dvi_set_mode(const struct fb_var_screeninfo *var,
- u16 cxres, u16 cyres, int iga);
-
-#endif /* __DVI_H__ */
diff --git a/drivers/video/via/global.c b/drivers/video/via/global.c
deleted file mode 100644
index 3102171c1674..000000000000
--- a/drivers/video/via/global.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-#include "global.h"
-int viafb_platform_epia_dvi = STATE_OFF;
-int viafb_device_lcd_dualedge = STATE_OFF;
-int viafb_bus_width = 12;
-int viafb_display_hardware_layout = HW_LAYOUT_LCD_DVI;
-int viafb_DeviceStatus = CRT_Device;
-int viafb_hotplug;
-int viafb_refresh = 60;
-int viafb_refresh1 = 60;
-int viafb_lcd_dsp_method = LCD_EXPANDSION;
-int viafb_lcd_mode = LCD_OPENLDI;
-int viafb_CRT_ON = 1;
-int viafb_DVI_ON;
-int viafb_LCD_ON ;
-int viafb_LCD2_ON;
-int viafb_SAMM_ON;
-int viafb_dual_fb;
-unsigned int viafb_second_xres = 640;
-unsigned int viafb_second_yres = 480;
-int viafb_hotplug_Xres = 640;
-int viafb_hotplug_Yres = 480;
-int viafb_hotplug_bpp = 32;
-int viafb_hotplug_refresh = 60;
-int viafb_primary_dev = None_Device;
-int viafb_lcd_panel_id = LCD_PANEL_ID_MAXIMUM + 1;
-struct fb_info *viafbinfo;
-struct fb_info *viafbinfo1;
-struct viafb_par *viaparinfo;
-struct viafb_par *viaparinfo1;
-
diff --git a/drivers/video/via/global.h b/drivers/video/via/global.h
deleted file mode 100644
index 275dbbbd6b81..000000000000
--- a/drivers/video/via/global.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __GLOBAL_H__
-#define __GLOBAL_H__
-
-#include <linux/fb.h>
-#include <linux/delay.h>
-#include <linux/ioport.h>
-#include <linux/pci.h>
-#include <linux/io.h>
-#include <linux/uaccess.h>
-#include <linux/init.h>
-#include <linux/proc_fs.h>
-#include <linux/console.h>
-#include <linux/timer.h>
-
-#include "debug.h"
-
-#include "viafbdev.h"
-#include "chip.h"
-#include "accel.h"
-#include "share.h"
-#include "dvi.h"
-#include "viamode.h"
-#include "hw.h"
-
-#include "lcd.h"
-#include "ioctl.h"
-#include "via_utility.h"
-#include "vt1636.h"
-#include "tblDPASetting.h"
-
-/* External struct*/
-
-extern int viafb_platform_epia_dvi;
-extern int viafb_device_lcd_dualedge;
-extern int viafb_bus_width;
-extern int viafb_display_hardware_layout;
-extern struct offset offset_reg;
-extern struct viafb_par *viaparinfo;
-extern struct viafb_par *viaparinfo1;
-extern struct fb_info *viafbinfo;
-extern struct fb_info *viafbinfo1;
-extern int viafb_DeviceStatus;
-extern int viafb_refresh;
-extern int viafb_refresh1;
-extern int viafb_lcd_dsp_method;
-extern int viafb_lcd_mode;
-
-extern int viafb_CRT_ON;
-extern unsigned int viafb_second_xres;
-extern unsigned int viafb_second_yres;
-extern int viafb_hotplug_Xres;
-extern int viafb_hotplug_Yres;
-extern int viafb_hotplug_bpp;
-extern int viafb_hotplug_refresh;
-extern int viafb_primary_dev;
-
-extern int viafb_lcd_panel_id;
-
-#endif /* __GLOBAL_H__ */
diff --git a/drivers/video/via/hw.c b/drivers/video/via/hw.c
deleted file mode 100644
index 22450908306c..000000000000
--- a/drivers/video/via/hw.c
+++ /dev/null
@@ -1,2134 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <linux/via-core.h>
-#include <asm/olpc.h>
-#include "global.h"
-#include "via_clock.h"
-
-static struct pll_limit cle266_pll_limits[] = {
- {19, 19, 4, 0},
- {26, 102, 5, 0},
- {53, 112, 6, 0},
- {41, 100, 7, 0},
- {83, 108, 8, 0},
- {87, 118, 9, 0},
- {95, 115, 12, 0},
- {108, 108, 13, 0},
- {83, 83, 17, 0},
- {67, 98, 20, 0},
- {121, 121, 24, 0},
- {99, 99, 29, 0},
- {33, 33, 3, 1},
- {15, 23, 4, 1},
- {37, 121, 5, 1},
- {82, 82, 6, 1},
- {31, 84, 7, 1},
- {83, 83, 8, 1},
- {76, 127, 9, 1},
- {33, 121, 4, 2},
- {91, 118, 5, 2},
- {83, 109, 6, 2},
- {90, 90, 7, 2},
- {93, 93, 2, 3},
- {53, 53, 3, 3},
- {73, 117, 4, 3},
- {101, 127, 5, 3},
- {99, 99, 7, 3}
-};
-
-static struct pll_limit k800_pll_limits[] = {
- {22, 22, 2, 0},
- {28, 28, 3, 0},
- {81, 112, 3, 1},
- {86, 166, 4, 1},
- {109, 153, 5, 1},
- {66, 116, 3, 2},
- {93, 137, 4, 2},
- {117, 208, 5, 2},
- {30, 30, 2, 3},
- {69, 125, 3, 3},
- {89, 161, 4, 3},
- {121, 208, 5, 3},
- {66, 66, 2, 4},
- {85, 85, 3, 4},
- {141, 161, 4, 4},
- {177, 177, 5, 4}
-};
-
-static struct pll_limit cx700_pll_limits[] = {
- {98, 98, 3, 1},
- {86, 86, 4, 1},
- {109, 208, 5, 1},
- {68, 68, 2, 2},
- {95, 116, 3, 2},
- {93, 166, 4, 2},
- {110, 206, 5, 2},
- {174, 174, 7, 2},
- {82, 109, 3, 3},
- {117, 161, 4, 3},
- {112, 208, 5, 3},
- {141, 202, 5, 4}
-};
-
-static struct pll_limit vx855_pll_limits[] = {
- {86, 86, 4, 1},
- {108, 208, 5, 1},
- {110, 208, 5, 2},
- {83, 112, 3, 3},
- {103, 161, 4, 3},
- {112, 209, 5, 3},
- {142, 161, 4, 4},
- {141, 176, 5, 4}
-};
-
-/* according to VIA Technologies these values are based on experiment */
-static struct io_reg scaling_parameters[] = {
- {VIACR, CR7A, 0xFF, 0x01}, /* LCD Scaling Parameter 1 */
- {VIACR, CR7B, 0xFF, 0x02}, /* LCD Scaling Parameter 2 */
- {VIACR, CR7C, 0xFF, 0x03}, /* LCD Scaling Parameter 3 */
- {VIACR, CR7D, 0xFF, 0x04}, /* LCD Scaling Parameter 4 */
- {VIACR, CR7E, 0xFF, 0x07}, /* LCD Scaling Parameter 5 */
- {VIACR, CR7F, 0xFF, 0x0A}, /* LCD Scaling Parameter 6 */
- {VIACR, CR80, 0xFF, 0x0D}, /* LCD Scaling Parameter 7 */
- {VIACR, CR81, 0xFF, 0x13}, /* LCD Scaling Parameter 8 */
- {VIACR, CR82, 0xFF, 0x16}, /* LCD Scaling Parameter 9 */
- {VIACR, CR83, 0xFF, 0x19}, /* LCD Scaling Parameter 10 */
- {VIACR, CR84, 0xFF, 0x1C}, /* LCD Scaling Parameter 11 */
- {VIACR, CR85, 0xFF, 0x1D}, /* LCD Scaling Parameter 12 */
- {VIACR, CR86, 0xFF, 0x1E}, /* LCD Scaling Parameter 13 */
- {VIACR, CR87, 0xFF, 0x1F}, /* LCD Scaling Parameter 14 */
-};
-
-static struct io_reg common_vga[] = {
- {VIACR, CR07, 0x10, 0x10}, /* [0] vertical total (bit 8)
- [1] vertical display end (bit 8)
- [2] vertical retrace start (bit 8)
- [3] start vertical blanking (bit 8)
- [4] line compare (bit 8)
- [5] vertical total (bit 9)
- [6] vertical display end (bit 9)
- [7] vertical retrace start (bit 9) */
- {VIACR, CR08, 0xFF, 0x00}, /* [0-4] preset row scan
- [5-6] byte panning */
- {VIACR, CR09, 0xDF, 0x40}, /* [0-4] max scan line
- [5] start vertical blanking (bit 9)
- [6] line compare (bit 9)
- [7] scan doubling */
- {VIACR, CR0A, 0xFF, 0x1E}, /* [0-4] cursor start
- [5] cursor disable */
- {VIACR, CR0B, 0xFF, 0x00}, /* [0-4] cursor end
- [5-6] cursor skew */
- {VIACR, CR0E, 0xFF, 0x00}, /* [0-7] cursor location (high) */
- {VIACR, CR0F, 0xFF, 0x00}, /* [0-7] cursor location (low) */
- {VIACR, CR11, 0xF0, 0x80}, /* [0-3] vertical retrace end
- [6] memory refresh bandwidth
- [7] CRTC register protect enable */
- {VIACR, CR14, 0xFF, 0x00}, /* [0-4] underline location
- [5] divide memory address clock by 4
- [6] double word addressing */
- {VIACR, CR17, 0xFF, 0x63}, /* [0-1] mapping of display address 13-14
- [2] divide scan line clock by 2
- [3] divide memory address clock by 2
- [5] address wrap
- [6] byte mode select
- [7] sync enable */
- {VIACR, CR18, 0xFF, 0xFF}, /* [0-7] line compare */
-};
-
-static struct fifo_depth_select display_fifo_depth_reg = {
- /* IGA1 FIFO Depth_Select */
- {IGA1_FIFO_DEPTH_SELECT_REG_NUM, {{SR17, 0, 7} } },
- /* IGA2 FIFO Depth_Select */
- {IGA2_FIFO_DEPTH_SELECT_REG_NUM,
- {{CR68, 4, 7}, {CR94, 7, 7}, {CR95, 7, 7} } }
-};
-
-static struct fifo_threshold_select fifo_threshold_select_reg = {
- /* IGA1 FIFO Threshold Select */
- {IGA1_FIFO_THRESHOLD_REG_NUM, {{SR16, 0, 5}, {SR16, 7, 7} } },
- /* IGA2 FIFO Threshold Select */
- {IGA2_FIFO_THRESHOLD_REG_NUM, {{CR68, 0, 3}, {CR95, 4, 6} } }
-};
-
-static struct fifo_high_threshold_select fifo_high_threshold_select_reg = {
- /* IGA1 FIFO High Threshold Select */
- {IGA1_FIFO_HIGH_THRESHOLD_REG_NUM, {{SR18, 0, 5}, {SR18, 7, 7} } },
- /* IGA2 FIFO High Threshold Select */
- {IGA2_FIFO_HIGH_THRESHOLD_REG_NUM, {{CR92, 0, 3}, {CR95, 0, 2} } }
-};
-
-static struct display_queue_expire_num display_queue_expire_num_reg = {
- /* IGA1 Display Queue Expire Num */
- {IGA1_DISPLAY_QUEUE_EXPIRE_NUM_REG_NUM, {{SR22, 0, 4} } },
- /* IGA2 Display Queue Expire Num */
- {IGA2_DISPLAY_QUEUE_EXPIRE_NUM_REG_NUM, {{CR94, 0, 6} } }
-};
-
-/* Definition Fetch Count Registers*/
-static struct fetch_count fetch_count_reg = {
- /* IGA1 Fetch Count Register */
- {IGA1_FETCH_COUNT_REG_NUM, {{SR1C, 0, 7}, {SR1D, 0, 1} } },
- /* IGA2 Fetch Count Register */
- {IGA2_FETCH_COUNT_REG_NUM, {{CR65, 0, 7}, {CR67, 2, 3} } }
-};
-
-static struct rgbLUT palLUT_table[] = {
- /* {R,G,B} */
- /* Index 0x00~0x03 */
- {0x00, 0x00, 0x00}, {0x00, 0x00, 0x2A}, {0x00, 0x2A, 0x00}, {0x00,
- 0x2A,
- 0x2A},
- /* Index 0x04~0x07 */
- {0x2A, 0x00, 0x00}, {0x2A, 0x00, 0x2A}, {0x2A, 0x15, 0x00}, {0x2A,
- 0x2A,
- 0x2A},
- /* Index 0x08~0x0B */
- {0x15, 0x15, 0x15}, {0x15, 0x15, 0x3F}, {0x15, 0x3F, 0x15}, {0x15,
- 0x3F,
- 0x3F},
- /* Index 0x0C~0x0F */
- {0x3F, 0x15, 0x15}, {0x3F, 0x15, 0x3F}, {0x3F, 0x3F, 0x15}, {0x3F,
- 0x3F,
- 0x3F},
- /* Index 0x10~0x13 */
- {0x00, 0x00, 0x00}, {0x05, 0x05, 0x05}, {0x08, 0x08, 0x08}, {0x0B,
- 0x0B,
- 0x0B},
- /* Index 0x14~0x17 */
- {0x0E, 0x0E, 0x0E}, {0x11, 0x11, 0x11}, {0x14, 0x14, 0x14}, {0x18,
- 0x18,
- 0x18},
- /* Index 0x18~0x1B */
- {0x1C, 0x1C, 0x1C}, {0x20, 0x20, 0x20}, {0x24, 0x24, 0x24}, {0x28,
- 0x28,
- 0x28},
- /* Index 0x1C~0x1F */
- {0x2D, 0x2D, 0x2D}, {0x32, 0x32, 0x32}, {0x38, 0x38, 0x38}, {0x3F,
- 0x3F,
- 0x3F},
- /* Index 0x20~0x23 */
- {0x00, 0x00, 0x3F}, {0x10, 0x00, 0x3F}, {0x1F, 0x00, 0x3F}, {0x2F,
- 0x00,
- 0x3F},
- /* Index 0x24~0x27 */
- {0x3F, 0x00, 0x3F}, {0x3F, 0x00, 0x2F}, {0x3F, 0x00, 0x1F}, {0x3F,
- 0x00,
- 0x10},
- /* Index 0x28~0x2B */
- {0x3F, 0x00, 0x00}, {0x3F, 0x10, 0x00}, {0x3F, 0x1F, 0x00}, {0x3F,
- 0x2F,
- 0x00},
- /* Index 0x2C~0x2F */
- {0x3F, 0x3F, 0x00}, {0x2F, 0x3F, 0x00}, {0x1F, 0x3F, 0x00}, {0x10,
- 0x3F,
- 0x00},
- /* Index 0x30~0x33 */
- {0x00, 0x3F, 0x00}, {0x00, 0x3F, 0x10}, {0x00, 0x3F, 0x1F}, {0x00,
- 0x3F,
- 0x2F},
- /* Index 0x34~0x37 */
- {0x00, 0x3F, 0x3F}, {0x00, 0x2F, 0x3F}, {0x00, 0x1F, 0x3F}, {0x00,
- 0x10,
- 0x3F},
- /* Index 0x38~0x3B */
- {0x1F, 0x1F, 0x3F}, {0x27, 0x1F, 0x3F}, {0x2F, 0x1F, 0x3F}, {0x37,
- 0x1F,
- 0x3F},
- /* Index 0x3C~0x3F */
- {0x3F, 0x1F, 0x3F}, {0x3F, 0x1F, 0x37}, {0x3F, 0x1F, 0x2F}, {0x3F,
- 0x1F,
- 0x27},
- /* Index 0x40~0x43 */
- {0x3F, 0x1F, 0x1F}, {0x3F, 0x27, 0x1F}, {0x3F, 0x2F, 0x1F}, {0x3F,
- 0x3F,
- 0x1F},
- /* Index 0x44~0x47 */
- {0x3F, 0x3F, 0x1F}, {0x37, 0x3F, 0x1F}, {0x2F, 0x3F, 0x1F}, {0x27,
- 0x3F,
- 0x1F},
- /* Index 0x48~0x4B */
- {0x1F, 0x3F, 0x1F}, {0x1F, 0x3F, 0x27}, {0x1F, 0x3F, 0x2F}, {0x1F,
- 0x3F,
- 0x37},
- /* Index 0x4C~0x4F */
- {0x1F, 0x3F, 0x3F}, {0x1F, 0x37, 0x3F}, {0x1F, 0x2F, 0x3F}, {0x1F,
- 0x27,
- 0x3F},
- /* Index 0x50~0x53 */
- {0x2D, 0x2D, 0x3F}, {0x31, 0x2D, 0x3F}, {0x36, 0x2D, 0x3F}, {0x3A,
- 0x2D,
- 0x3F},
- /* Index 0x54~0x57 */
- {0x3F, 0x2D, 0x3F}, {0x3F, 0x2D, 0x3A}, {0x3F, 0x2D, 0x36}, {0x3F,
- 0x2D,
- 0x31},
- /* Index 0x58~0x5B */
- {0x3F, 0x2D, 0x2D}, {0x3F, 0x31, 0x2D}, {0x3F, 0x36, 0x2D}, {0x3F,
- 0x3A,
- 0x2D},
- /* Index 0x5C~0x5F */
- {0x3F, 0x3F, 0x2D}, {0x3A, 0x3F, 0x2D}, {0x36, 0x3F, 0x2D}, {0x31,
- 0x3F,
- 0x2D},
- /* Index 0x60~0x63 */
- {0x2D, 0x3F, 0x2D}, {0x2D, 0x3F, 0x31}, {0x2D, 0x3F, 0x36}, {0x2D,
- 0x3F,
- 0x3A},
- /* Index 0x64~0x67 */
- {0x2D, 0x3F, 0x3F}, {0x2D, 0x3A, 0x3F}, {0x2D, 0x36, 0x3F}, {0x2D,
- 0x31,
- 0x3F},
- /* Index 0x68~0x6B */
- {0x00, 0x00, 0x1C}, {0x07, 0x00, 0x1C}, {0x0E, 0x00, 0x1C}, {0x15,
- 0x00,
- 0x1C},
- /* Index 0x6C~0x6F */
- {0x1C, 0x00, 0x1C}, {0x1C, 0x00, 0x15}, {0x1C, 0x00, 0x0E}, {0x1C,
- 0x00,
- 0x07},
- /* Index 0x70~0x73 */
- {0x1C, 0x00, 0x00}, {0x1C, 0x07, 0x00}, {0x1C, 0x0E, 0x00}, {0x1C,
- 0x15,
- 0x00},
- /* Index 0x74~0x77 */
- {0x1C, 0x1C, 0x00}, {0x15, 0x1C, 0x00}, {0x0E, 0x1C, 0x00}, {0x07,
- 0x1C,
- 0x00},
- /* Index 0x78~0x7B */
- {0x00, 0x1C, 0x00}, {0x00, 0x1C, 0x07}, {0x00, 0x1C, 0x0E}, {0x00,
- 0x1C,
- 0x15},
- /* Index 0x7C~0x7F */
- {0x00, 0x1C, 0x1C}, {0x00, 0x15, 0x1C}, {0x00, 0x0E, 0x1C}, {0x00,
- 0x07,
- 0x1C},
- /* Index 0x80~0x83 */
- {0x0E, 0x0E, 0x1C}, {0x11, 0x0E, 0x1C}, {0x15, 0x0E, 0x1C}, {0x18,
- 0x0E,
- 0x1C},
- /* Index 0x84~0x87 */
- {0x1C, 0x0E, 0x1C}, {0x1C, 0x0E, 0x18}, {0x1C, 0x0E, 0x15}, {0x1C,
- 0x0E,
- 0x11},
- /* Index 0x88~0x8B */
- {0x1C, 0x0E, 0x0E}, {0x1C, 0x11, 0x0E}, {0x1C, 0x15, 0x0E}, {0x1C,
- 0x18,
- 0x0E},
- /* Index 0x8C~0x8F */
- {0x1C, 0x1C, 0x0E}, {0x18, 0x1C, 0x0E}, {0x15, 0x1C, 0x0E}, {0x11,
- 0x1C,
- 0x0E},
- /* Index 0x90~0x93 */
- {0x0E, 0x1C, 0x0E}, {0x0E, 0x1C, 0x11}, {0x0E, 0x1C, 0x15}, {0x0E,
- 0x1C,
- 0x18},
- /* Index 0x94~0x97 */
- {0x0E, 0x1C, 0x1C}, {0x0E, 0x18, 0x1C}, {0x0E, 0x15, 0x1C}, {0x0E,
- 0x11,
- 0x1C},
- /* Index 0x98~0x9B */
- {0x14, 0x14, 0x1C}, {0x16, 0x14, 0x1C}, {0x18, 0x14, 0x1C}, {0x1A,
- 0x14,
- 0x1C},
- /* Index 0x9C~0x9F */
- {0x1C, 0x14, 0x1C}, {0x1C, 0x14, 0x1A}, {0x1C, 0x14, 0x18}, {0x1C,
- 0x14,
- 0x16},
- /* Index 0xA0~0xA3 */
- {0x1C, 0x14, 0x14}, {0x1C, 0x16, 0x14}, {0x1C, 0x18, 0x14}, {0x1C,
- 0x1A,
- 0x14},
- /* Index 0xA4~0xA7 */
- {0x1C, 0x1C, 0x14}, {0x1A, 0x1C, 0x14}, {0x18, 0x1C, 0x14}, {0x16,
- 0x1C,
- 0x14},
- /* Index 0xA8~0xAB */
- {0x14, 0x1C, 0x14}, {0x14, 0x1C, 0x16}, {0x14, 0x1C, 0x18}, {0x14,
- 0x1C,
- 0x1A},
- /* Index 0xAC~0xAF */
- {0x14, 0x1C, 0x1C}, {0x14, 0x1A, 0x1C}, {0x14, 0x18, 0x1C}, {0x14,
- 0x16,
- 0x1C},
- /* Index 0xB0~0xB3 */
- {0x00, 0x00, 0x10}, {0x04, 0x00, 0x10}, {0x08, 0x00, 0x10}, {0x0C,
- 0x00,
- 0x10},
- /* Index 0xB4~0xB7 */
- {0x10, 0x00, 0x10}, {0x10, 0x00, 0x0C}, {0x10, 0x00, 0x08}, {0x10,
- 0x00,
- 0x04},
- /* Index 0xB8~0xBB */
- {0x10, 0x00, 0x00}, {0x10, 0x04, 0x00}, {0x10, 0x08, 0x00}, {0x10,
- 0x0C,
- 0x00},
- /* Index 0xBC~0xBF */
- {0x10, 0x10, 0x00}, {0x0C, 0x10, 0x00}, {0x08, 0x10, 0x00}, {0x04,
- 0x10,
- 0x00},
- /* Index 0xC0~0xC3 */
- {0x00, 0x10, 0x00}, {0x00, 0x10, 0x04}, {0x00, 0x10, 0x08}, {0x00,
- 0x10,
- 0x0C},
- /* Index 0xC4~0xC7 */
- {0x00, 0x10, 0x10}, {0x00, 0x0C, 0x10}, {0x00, 0x08, 0x10}, {0x00,
- 0x04,
- 0x10},
- /* Index 0xC8~0xCB */
- {0x08, 0x08, 0x10}, {0x0A, 0x08, 0x10}, {0x0C, 0x08, 0x10}, {0x0E,
- 0x08,
- 0x10},
- /* Index 0xCC~0xCF */
- {0x10, 0x08, 0x10}, {0x10, 0x08, 0x0E}, {0x10, 0x08, 0x0C}, {0x10,
- 0x08,
- 0x0A},
- /* Index 0xD0~0xD3 */
- {0x10, 0x08, 0x08}, {0x10, 0x0A, 0x08}, {0x10, 0x0C, 0x08}, {0x10,
- 0x0E,
- 0x08},
- /* Index 0xD4~0xD7 */
- {0x10, 0x10, 0x08}, {0x0E, 0x10, 0x08}, {0x0C, 0x10, 0x08}, {0x0A,
- 0x10,
- 0x08},
- /* Index 0xD8~0xDB */
- {0x08, 0x10, 0x08}, {0x08, 0x10, 0x0A}, {0x08, 0x10, 0x0C}, {0x08,
- 0x10,
- 0x0E},
- /* Index 0xDC~0xDF */
- {0x08, 0x10, 0x10}, {0x08, 0x0E, 0x10}, {0x08, 0x0C, 0x10}, {0x08,
- 0x0A,
- 0x10},
- /* Index 0xE0~0xE3 */
- {0x0B, 0x0B, 0x10}, {0x0C, 0x0B, 0x10}, {0x0D, 0x0B, 0x10}, {0x0F,
- 0x0B,
- 0x10},
- /* Index 0xE4~0xE7 */
- {0x10, 0x0B, 0x10}, {0x10, 0x0B, 0x0F}, {0x10, 0x0B, 0x0D}, {0x10,
- 0x0B,
- 0x0C},
- /* Index 0xE8~0xEB */
- {0x10, 0x0B, 0x0B}, {0x10, 0x0C, 0x0B}, {0x10, 0x0D, 0x0B}, {0x10,
- 0x0F,
- 0x0B},
- /* Index 0xEC~0xEF */
- {0x10, 0x10, 0x0B}, {0x0F, 0x10, 0x0B}, {0x0D, 0x10, 0x0B}, {0x0C,
- 0x10,
- 0x0B},
- /* Index 0xF0~0xF3 */
- {0x0B, 0x10, 0x0B}, {0x0B, 0x10, 0x0C}, {0x0B, 0x10, 0x0D}, {0x0B,
- 0x10,
- 0x0F},
- /* Index 0xF4~0xF7 */
- {0x0B, 0x10, 0x10}, {0x0B, 0x0F, 0x10}, {0x0B, 0x0D, 0x10}, {0x0B,
- 0x0C,
- 0x10},
- /* Index 0xF8~0xFB */
- {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00,
- 0x00,
- 0x00},
- /* Index 0xFC~0xFF */
- {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00,
- 0x00,
- 0x00}
-};
-
-static struct via_device_mapping device_mapping[] = {
- {VIA_LDVP0, "LDVP0"},
- {VIA_LDVP1, "LDVP1"},
- {VIA_DVP0, "DVP0"},
- {VIA_CRT, "CRT"},
- {VIA_DVP1, "DVP1"},
- {VIA_LVDS1, "LVDS1"},
- {VIA_LVDS2, "LVDS2"}
-};
-
-/* structure with function pointers to support clock control */
-static struct via_clock clock;
-
-static void load_fix_bit_crtc_reg(void);
-static void init_gfx_chip_info(int chip_type);
-static void init_tmds_chip_info(void);
-static void init_lvds_chip_info(void);
-static void device_screen_off(void);
-static void device_screen_on(void);
-static void set_display_channel(void);
-static void device_off(void);
-static void device_on(void);
-static void enable_second_display_channel(void);
-static void disable_second_display_channel(void);
-
-void viafb_lock_crt(void)
-{
- viafb_write_reg_mask(CR11, VIACR, BIT7, BIT7);
-}
-
-void viafb_unlock_crt(void)
-{
- viafb_write_reg_mask(CR11, VIACR, 0, BIT7);
- viafb_write_reg_mask(CR47, VIACR, 0, BIT0);
-}
-
-static void write_dac_reg(u8 index, u8 r, u8 g, u8 b)
-{
- outb(index, LUT_INDEX_WRITE);
- outb(r, LUT_DATA);
- outb(g, LUT_DATA);
- outb(b, LUT_DATA);
-}
-
-static u32 get_dvi_devices(int output_interface)
-{
- switch (output_interface) {
- case INTERFACE_DVP0:
- return VIA_DVP0 | VIA_LDVP0;
-
- case INTERFACE_DVP1:
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
- return VIA_LDVP1;
- else
- return VIA_DVP1;
-
- case INTERFACE_DFP_HIGH:
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
- return 0;
- else
- return VIA_LVDS2 | VIA_DVP0;
-
- case INTERFACE_DFP_LOW:
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
- return 0;
- else
- return VIA_DVP1 | VIA_LVDS1;
-
- case INTERFACE_TMDS:
- return VIA_LVDS1;
- }
-
- return 0;
-}
-
-static u32 get_lcd_devices(int output_interface)
-{
- switch (output_interface) {
- case INTERFACE_DVP0:
- return VIA_DVP0;
-
- case INTERFACE_DVP1:
- return VIA_DVP1;
-
- case INTERFACE_DFP_HIGH:
- return VIA_LVDS2 | VIA_DVP0;
-
- case INTERFACE_DFP_LOW:
- return VIA_LVDS1 | VIA_DVP1;
-
- case INTERFACE_DFP:
- return VIA_LVDS1 | VIA_LVDS2;
-
- case INTERFACE_LVDS0:
- case INTERFACE_LVDS0LVDS1:
- return VIA_LVDS1;
-
- case INTERFACE_LVDS1:
- return VIA_LVDS2;
- }
-
- return 0;
-}
-
-/*Set IGA path for each device*/
-void viafb_set_iga_path(void)
-{
- int crt_iga_path = 0;
-
- if (viafb_SAMM_ON == 1) {
- if (viafb_CRT_ON) {
- if (viafb_primary_dev == CRT_Device)
- crt_iga_path = IGA1;
- else
- crt_iga_path = IGA2;
- }
-
- if (viafb_DVI_ON) {
- if (viafb_primary_dev == DVI_Device)
- viaparinfo->tmds_setting_info->iga_path = IGA1;
- else
- viaparinfo->tmds_setting_info->iga_path = IGA2;
- }
-
- if (viafb_LCD_ON) {
- if (viafb_primary_dev == LCD_Device) {
- if (viafb_dual_fb &&
- (viaparinfo->chip_info->gfx_chip_name ==
- UNICHROME_CLE266)) {
- viaparinfo->
- lvds_setting_info->iga_path = IGA2;
- crt_iga_path = IGA1;
- viaparinfo->
- tmds_setting_info->iga_path = IGA1;
- } else
- viaparinfo->
- lvds_setting_info->iga_path = IGA1;
- } else {
- viaparinfo->lvds_setting_info->iga_path = IGA2;
- }
- }
- if (viafb_LCD2_ON) {
- if (LCD2_Device == viafb_primary_dev)
- viaparinfo->lvds_setting_info2->iga_path = IGA1;
- else
- viaparinfo->lvds_setting_info2->iga_path = IGA2;
- }
- } else {
- viafb_SAMM_ON = 0;
-
- if (viafb_CRT_ON && viafb_LCD_ON) {
- crt_iga_path = IGA1;
- viaparinfo->lvds_setting_info->iga_path = IGA2;
- } else if (viafb_CRT_ON && viafb_DVI_ON) {
- crt_iga_path = IGA1;
- viaparinfo->tmds_setting_info->iga_path = IGA2;
- } else if (viafb_LCD_ON && viafb_DVI_ON) {
- viaparinfo->tmds_setting_info->iga_path = IGA1;
- viaparinfo->lvds_setting_info->iga_path = IGA2;
- } else if (viafb_LCD_ON && viafb_LCD2_ON) {
- viaparinfo->lvds_setting_info->iga_path = IGA2;
- viaparinfo->lvds_setting_info2->iga_path = IGA2;
- } else if (viafb_CRT_ON) {
- crt_iga_path = IGA1;
- } else if (viafb_LCD_ON) {
- viaparinfo->lvds_setting_info->iga_path = IGA2;
- } else if (viafb_DVI_ON) {
- viaparinfo->tmds_setting_info->iga_path = IGA1;
- }
- }
-
- viaparinfo->shared->iga1_devices = 0;
- viaparinfo->shared->iga2_devices = 0;
- if (viafb_CRT_ON) {
- if (crt_iga_path == IGA1)
- viaparinfo->shared->iga1_devices |= VIA_CRT;
- else
- viaparinfo->shared->iga2_devices |= VIA_CRT;
- }
-
- if (viafb_DVI_ON) {
- if (viaparinfo->tmds_setting_info->iga_path == IGA1)
- viaparinfo->shared->iga1_devices |= get_dvi_devices(
- viaparinfo->chip_info->
- tmds_chip_info.output_interface);
- else
- viaparinfo->shared->iga2_devices |= get_dvi_devices(
- viaparinfo->chip_info->
- tmds_chip_info.output_interface);
- }
-
- if (viafb_LCD_ON) {
- if (viaparinfo->lvds_setting_info->iga_path == IGA1)
- viaparinfo->shared->iga1_devices |= get_lcd_devices(
- viaparinfo->chip_info->
- lvds_chip_info.output_interface);
- else
- viaparinfo->shared->iga2_devices |= get_lcd_devices(
- viaparinfo->chip_info->
- lvds_chip_info.output_interface);
- }
-
- if (viafb_LCD2_ON) {
- if (viaparinfo->lvds_setting_info2->iga_path == IGA1)
- viaparinfo->shared->iga1_devices |= get_lcd_devices(
- viaparinfo->chip_info->
- lvds_chip_info2.output_interface);
- else
- viaparinfo->shared->iga2_devices |= get_lcd_devices(
- viaparinfo->chip_info->
- lvds_chip_info2.output_interface);
- }
-
- /* looks like the OLPC has its display wired to DVP1 and LVDS2 */
- if (machine_is_olpc())
- viaparinfo->shared->iga2_devices = VIA_DVP1 | VIA_LVDS2;
-}
-
-static void set_color_register(u8 index, u8 red, u8 green, u8 blue)
-{
- outb(0xFF, 0x3C6); /* bit mask of palette */
- outb(index, 0x3C8);
- outb(red, 0x3C9);
- outb(green, 0x3C9);
- outb(blue, 0x3C9);
-}
-
-void viafb_set_primary_color_register(u8 index, u8 red, u8 green, u8 blue)
-{
- viafb_write_reg_mask(0x1A, VIASR, 0x00, 0x01);
- set_color_register(index, red, green, blue);
-}
-
-void viafb_set_secondary_color_register(u8 index, u8 red, u8 green, u8 blue)
-{
- viafb_write_reg_mask(0x1A, VIASR, 0x01, 0x01);
- set_color_register(index, red, green, blue);
-}
-
-static void set_source_common(u8 index, u8 offset, u8 iga)
-{
- u8 value, mask = 1 << offset;
-
- switch (iga) {
- case IGA1:
- value = 0x00;
- break;
- case IGA2:
- value = mask;
- break;
- default:
- printk(KERN_WARNING "viafb: Unsupported source: %d\n", iga);
- return;
- }
-
- via_write_reg_mask(VIACR, index, value, mask);
-}
-
-static void set_crt_source(u8 iga)
-{
- u8 value;
-
- switch (iga) {
- case IGA1:
- value = 0x00;
- break;
- case IGA2:
- value = 0x40;
- break;
- default:
- printk(KERN_WARNING "viafb: Unsupported source: %d\n", iga);
- return;
- }
-
- via_write_reg_mask(VIASR, 0x16, value, 0x40);
-}
-
-static inline void set_ldvp0_source(u8 iga)
-{
- set_source_common(0x6C, 7, iga);
-}
-
-static inline void set_ldvp1_source(u8 iga)
-{
- set_source_common(0x93, 7, iga);
-}
-
-static inline void set_dvp0_source(u8 iga)
-{
- set_source_common(0x96, 4, iga);
-}
-
-static inline void set_dvp1_source(u8 iga)
-{
- set_source_common(0x9B, 4, iga);
-}
-
-static inline void set_lvds1_source(u8 iga)
-{
- set_source_common(0x99, 4, iga);
-}
-
-static inline void set_lvds2_source(u8 iga)
-{
- set_source_common(0x97, 4, iga);
-}
-
-void via_set_source(u32 devices, u8 iga)
-{
- if (devices & VIA_LDVP0)
- set_ldvp0_source(iga);
- if (devices & VIA_LDVP1)
- set_ldvp1_source(iga);
- if (devices & VIA_DVP0)
- set_dvp0_source(iga);
- if (devices & VIA_CRT)
- set_crt_source(iga);
- if (devices & VIA_DVP1)
- set_dvp1_source(iga);
- if (devices & VIA_LVDS1)
- set_lvds1_source(iga);
- if (devices & VIA_LVDS2)
- set_lvds2_source(iga);
-}
-
-static void set_crt_state(u8 state)
-{
- u8 value;
-
- switch (state) {
- case VIA_STATE_ON:
- value = 0x00;
- break;
- case VIA_STATE_STANDBY:
- value = 0x10;
- break;
- case VIA_STATE_SUSPEND:
- value = 0x20;
- break;
- case VIA_STATE_OFF:
- value = 0x30;
- break;
- default:
- return;
- }
-
- via_write_reg_mask(VIACR, 0x36, value, 0x30);
-}
-
-static void set_dvp0_state(u8 state)
-{
- u8 value;
-
- switch (state) {
- case VIA_STATE_ON:
- value = 0xC0;
- break;
- case VIA_STATE_OFF:
- value = 0x00;
- break;
- default:
- return;
- }
-
- via_write_reg_mask(VIASR, 0x1E, value, 0xC0);
-}
-
-static void set_dvp1_state(u8 state)
-{
- u8 value;
-
- switch (state) {
- case VIA_STATE_ON:
- value = 0x30;
- break;
- case VIA_STATE_OFF:
- value = 0x00;
- break;
- default:
- return;
- }
-
- via_write_reg_mask(VIASR, 0x1E, value, 0x30);
-}
-
-static void set_lvds1_state(u8 state)
-{
- u8 value;
-
- switch (state) {
- case VIA_STATE_ON:
- value = 0x03;
- break;
- case VIA_STATE_OFF:
- value = 0x00;
- break;
- default:
- return;
- }
-
- via_write_reg_mask(VIASR, 0x2A, value, 0x03);
-}
-
-static void set_lvds2_state(u8 state)
-{
- u8 value;
-
- switch (state) {
- case VIA_STATE_ON:
- value = 0x0C;
- break;
- case VIA_STATE_OFF:
- value = 0x00;
- break;
- default:
- return;
- }
-
- via_write_reg_mask(VIASR, 0x2A, value, 0x0C);
-}
-
-void via_set_state(u32 devices, u8 state)
-{
- /*
- TODO: Can we enable/disable these devices? How?
- if (devices & VIA_LDVP0)
- if (devices & VIA_LDVP1)
- */
- if (devices & VIA_DVP0)
- set_dvp0_state(state);
- if (devices & VIA_CRT)
- set_crt_state(state);
- if (devices & VIA_DVP1)
- set_dvp1_state(state);
- if (devices & VIA_LVDS1)
- set_lvds1_state(state);
- if (devices & VIA_LVDS2)
- set_lvds2_state(state);
-}
-
-void via_set_sync_polarity(u32 devices, u8 polarity)
-{
- if (polarity & ~(VIA_HSYNC_NEGATIVE | VIA_VSYNC_NEGATIVE)) {
- printk(KERN_WARNING "viafb: Unsupported polarity: %d\n",
- polarity);
- return;
- }
-
- if (devices & VIA_CRT)
- via_write_misc_reg_mask(polarity << 6, 0xC0);
- if (devices & VIA_DVP1)
- via_write_reg_mask(VIACR, 0x9B, polarity << 5, 0x60);
- if (devices & VIA_LVDS1)
- via_write_reg_mask(VIACR, 0x99, polarity << 5, 0x60);
- if (devices & VIA_LVDS2)
- via_write_reg_mask(VIACR, 0x97, polarity << 5, 0x60);
-}
-
-u32 via_parse_odev(char *input, char **end)
-{
- char *ptr = input;
- u32 odev = 0;
- bool next = true;
- int i, len;
-
- while (next) {
- next = false;
- for (i = 0; i < ARRAY_SIZE(device_mapping); i++) {
- len = strlen(device_mapping[i].name);
- if (!strncmp(ptr, device_mapping[i].name, len)) {
- odev |= device_mapping[i].device;
- ptr += len;
- if (*ptr == ',') {
- ptr++;
- next = true;
- }
- }
- }
- }
-
- *end = ptr;
- return odev;
-}
-
-void via_odev_to_seq(struct seq_file *m, u32 odev)
-{
- int i, count = 0;
-
- for (i = 0; i < ARRAY_SIZE(device_mapping); i++) {
- if (odev & device_mapping[i].device) {
- if (count > 0)
- seq_putc(m, ',');
-
- seq_puts(m, device_mapping[i].name);
- count++;
- }
- }
-
- seq_putc(m, '\n');
-}
-
-static void load_fix_bit_crtc_reg(void)
-{
- viafb_unlock_crt();
-
- /* always set to 1 */
- viafb_write_reg_mask(CR03, VIACR, 0x80, BIT7);
- /* line compare should set all bits = 1 (extend modes) */
- viafb_write_reg_mask(CR35, VIACR, 0x10, BIT4);
- /* line compare should set all bits = 1 (extend modes) */
- viafb_write_reg_mask(CR33, VIACR, 0x06, BIT0 + BIT1 + BIT2);
- /*viafb_write_reg_mask(CR32, VIACR, 0x01, BIT0); */
-
- viafb_lock_crt();
-
- /* If K8M800, enable Prefetch Mode. */
- if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800)
- || (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K8M890))
- viafb_write_reg_mask(CR33, VIACR, 0x08, BIT3);
- if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
- && (viaparinfo->chip_info->gfx_chip_revision == CLE266_REVISION_AX))
- viafb_write_reg_mask(SR1A, VIASR, 0x02, BIT1);
-
-}
-
-void viafb_load_reg(int timing_value, int viafb_load_reg_num,
- struct io_register *reg,
- int io_type)
-{
- int reg_mask;
- int bit_num = 0;
- int data;
- int i, j;
- int shift_next_reg;
- int start_index, end_index, cr_index;
- u16 get_bit;
-
- for (i = 0; i < viafb_load_reg_num; i++) {
- reg_mask = 0;
- data = 0;
- start_index = reg[i].start_bit;
- end_index = reg[i].end_bit;
- cr_index = reg[i].io_addr;
-
- shift_next_reg = bit_num;
- for (j = start_index; j <= end_index; j++) {
- /*if (bit_num==8) timing_value = timing_value >>8; */
- reg_mask = reg_mask | (BIT0 << j);
- get_bit = (timing_value & (BIT0 << bit_num));
- data =
- data | ((get_bit >> shift_next_reg) << start_index);
- bit_num++;
- }
- if (io_type == VIACR)
- viafb_write_reg_mask(cr_index, VIACR, data, reg_mask);
- else
- viafb_write_reg_mask(cr_index, VIASR, data, reg_mask);
- }
-
-}
-
-/* Write Registers */
-void viafb_write_regx(struct io_reg RegTable[], int ItemNum)
-{
- int i;
-
- /*DEBUG_MSG(KERN_INFO "Table Size : %x!!\n",ItemNum ); */
-
- for (i = 0; i < ItemNum; i++)
- via_write_reg_mask(RegTable[i].port, RegTable[i].index,
- RegTable[i].value, RegTable[i].mask);
-}
-
-void viafb_load_fetch_count_reg(int h_addr, int bpp_byte, int set_iga)
-{
- int reg_value;
- int viafb_load_reg_num;
- struct io_register *reg = NULL;
-
- switch (set_iga) {
- case IGA1:
- reg_value = IGA1_FETCH_COUNT_FORMULA(h_addr, bpp_byte);
- viafb_load_reg_num = fetch_count_reg.
- iga1_fetch_count_reg.reg_num;
- reg = fetch_count_reg.iga1_fetch_count_reg.reg;
- viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR);
- break;
- case IGA2:
- reg_value = IGA2_FETCH_COUNT_FORMULA(h_addr, bpp_byte);
- viafb_load_reg_num = fetch_count_reg.
- iga2_fetch_count_reg.reg_num;
- reg = fetch_count_reg.iga2_fetch_count_reg.reg;
- viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR);
- break;
- }
-
-}
-
-void viafb_load_FIFO_reg(int set_iga, int hor_active, int ver_active)
-{
- int reg_value;
- int viafb_load_reg_num;
- struct io_register *reg = NULL;
- int iga1_fifo_max_depth = 0, iga1_fifo_threshold =
- 0, iga1_fifo_high_threshold = 0, iga1_display_queue_expire_num = 0;
- int iga2_fifo_max_depth = 0, iga2_fifo_threshold =
- 0, iga2_fifo_high_threshold = 0, iga2_display_queue_expire_num = 0;
-
- if (set_iga == IGA1) {
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800) {
- iga1_fifo_max_depth = K800_IGA1_FIFO_MAX_DEPTH;
- iga1_fifo_threshold = K800_IGA1_FIFO_THRESHOLD;
- iga1_fifo_high_threshold =
- K800_IGA1_FIFO_HIGH_THRESHOLD;
- /* If resolution > 1280x1024, expire length = 64, else
- expire length = 128 */
- if ((hor_active > 1280) && (ver_active > 1024))
- iga1_display_queue_expire_num = 16;
- else
- iga1_display_queue_expire_num =
- K800_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
-
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_PM800) {
- iga1_fifo_max_depth = P880_IGA1_FIFO_MAX_DEPTH;
- iga1_fifo_threshold = P880_IGA1_FIFO_THRESHOLD;
- iga1_fifo_high_threshold =
- P880_IGA1_FIFO_HIGH_THRESHOLD;
- iga1_display_queue_expire_num =
- P880_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
-
- /* If resolution > 1280x1024, expire length = 64, else
- expire length = 128 */
- if ((hor_active > 1280) && (ver_active > 1024))
- iga1_display_queue_expire_num = 16;
- else
- iga1_display_queue_expire_num =
- P880_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CN700) {
- iga1_fifo_max_depth = CN700_IGA1_FIFO_MAX_DEPTH;
- iga1_fifo_threshold = CN700_IGA1_FIFO_THRESHOLD;
- iga1_fifo_high_threshold =
- CN700_IGA1_FIFO_HIGH_THRESHOLD;
-
- /* If resolution > 1280x1024, expire length = 64,
- else expire length = 128 */
- if ((hor_active > 1280) && (ver_active > 1024))
- iga1_display_queue_expire_num = 16;
- else
- iga1_display_queue_expire_num =
- CN700_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) {
- iga1_fifo_max_depth = CX700_IGA1_FIFO_MAX_DEPTH;
- iga1_fifo_threshold = CX700_IGA1_FIFO_THRESHOLD;
- iga1_fifo_high_threshold =
- CX700_IGA1_FIFO_HIGH_THRESHOLD;
- iga1_display_queue_expire_num =
- CX700_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K8M890) {
- iga1_fifo_max_depth = K8M890_IGA1_FIFO_MAX_DEPTH;
- iga1_fifo_threshold = K8M890_IGA1_FIFO_THRESHOLD;
- iga1_fifo_high_threshold =
- K8M890_IGA1_FIFO_HIGH_THRESHOLD;
- iga1_display_queue_expire_num =
- K8M890_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_P4M890) {
- iga1_fifo_max_depth = P4M890_IGA1_FIFO_MAX_DEPTH;
- iga1_fifo_threshold = P4M890_IGA1_FIFO_THRESHOLD;
- iga1_fifo_high_threshold =
- P4M890_IGA1_FIFO_HIGH_THRESHOLD;
- iga1_display_queue_expire_num =
- P4M890_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_P4M900) {
- iga1_fifo_max_depth = P4M900_IGA1_FIFO_MAX_DEPTH;
- iga1_fifo_threshold = P4M900_IGA1_FIFO_THRESHOLD;
- iga1_fifo_high_threshold =
- P4M900_IGA1_FIFO_HIGH_THRESHOLD;
- iga1_display_queue_expire_num =
- P4M900_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX800) {
- iga1_fifo_max_depth = VX800_IGA1_FIFO_MAX_DEPTH;
- iga1_fifo_threshold = VX800_IGA1_FIFO_THRESHOLD;
- iga1_fifo_high_threshold =
- VX800_IGA1_FIFO_HIGH_THRESHOLD;
- iga1_display_queue_expire_num =
- VX800_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX855) {
- iga1_fifo_max_depth = VX855_IGA1_FIFO_MAX_DEPTH;
- iga1_fifo_threshold = VX855_IGA1_FIFO_THRESHOLD;
- iga1_fifo_high_threshold =
- VX855_IGA1_FIFO_HIGH_THRESHOLD;
- iga1_display_queue_expire_num =
- VX855_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX900) {
- iga1_fifo_max_depth = VX900_IGA1_FIFO_MAX_DEPTH;
- iga1_fifo_threshold = VX900_IGA1_FIFO_THRESHOLD;
- iga1_fifo_high_threshold =
- VX900_IGA1_FIFO_HIGH_THRESHOLD;
- iga1_display_queue_expire_num =
- VX900_IGA1_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- /* Set Display FIFO Depath Select */
- reg_value = IGA1_FIFO_DEPTH_SELECT_FORMULA(iga1_fifo_max_depth);
- viafb_load_reg_num =
- display_fifo_depth_reg.iga1_fifo_depth_select_reg.reg_num;
- reg = display_fifo_depth_reg.iga1_fifo_depth_select_reg.reg;
- viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR);
-
- /* Set Display FIFO Threshold Select */
- reg_value = IGA1_FIFO_THRESHOLD_FORMULA(iga1_fifo_threshold);
- viafb_load_reg_num =
- fifo_threshold_select_reg.
- iga1_fifo_threshold_select_reg.reg_num;
- reg =
- fifo_threshold_select_reg.
- iga1_fifo_threshold_select_reg.reg;
- viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR);
-
- /* Set FIFO High Threshold Select */
- reg_value =
- IGA1_FIFO_HIGH_THRESHOLD_FORMULA(iga1_fifo_high_threshold);
- viafb_load_reg_num =
- fifo_high_threshold_select_reg.
- iga1_fifo_high_threshold_select_reg.reg_num;
- reg =
- fifo_high_threshold_select_reg.
- iga1_fifo_high_threshold_select_reg.reg;
- viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR);
-
- /* Set Display Queue Expire Num */
- reg_value =
- IGA1_DISPLAY_QUEUE_EXPIRE_NUM_FORMULA
- (iga1_display_queue_expire_num);
- viafb_load_reg_num =
- display_queue_expire_num_reg.
- iga1_display_queue_expire_num_reg.reg_num;
- reg =
- display_queue_expire_num_reg.
- iga1_display_queue_expire_num_reg.reg;
- viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR);
-
- } else {
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800) {
- iga2_fifo_max_depth = K800_IGA2_FIFO_MAX_DEPTH;
- iga2_fifo_threshold = K800_IGA2_FIFO_THRESHOLD;
- iga2_fifo_high_threshold =
- K800_IGA2_FIFO_HIGH_THRESHOLD;
-
- /* If resolution > 1280x1024, expire length = 64,
- else expire length = 128 */
- if ((hor_active > 1280) && (ver_active > 1024))
- iga2_display_queue_expire_num = 16;
- else
- iga2_display_queue_expire_num =
- K800_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_PM800) {
- iga2_fifo_max_depth = P880_IGA2_FIFO_MAX_DEPTH;
- iga2_fifo_threshold = P880_IGA2_FIFO_THRESHOLD;
- iga2_fifo_high_threshold =
- P880_IGA2_FIFO_HIGH_THRESHOLD;
-
- /* If resolution > 1280x1024, expire length = 64,
- else expire length = 128 */
- if ((hor_active > 1280) && (ver_active > 1024))
- iga2_display_queue_expire_num = 16;
- else
- iga2_display_queue_expire_num =
- P880_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CN700) {
- iga2_fifo_max_depth = CN700_IGA2_FIFO_MAX_DEPTH;
- iga2_fifo_threshold = CN700_IGA2_FIFO_THRESHOLD;
- iga2_fifo_high_threshold =
- CN700_IGA2_FIFO_HIGH_THRESHOLD;
-
- /* If resolution > 1280x1024, expire length = 64,
- else expire length = 128 */
- if ((hor_active > 1280) && (ver_active > 1024))
- iga2_display_queue_expire_num = 16;
- else
- iga2_display_queue_expire_num =
- CN700_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) {
- iga2_fifo_max_depth = CX700_IGA2_FIFO_MAX_DEPTH;
- iga2_fifo_threshold = CX700_IGA2_FIFO_THRESHOLD;
- iga2_fifo_high_threshold =
- CX700_IGA2_FIFO_HIGH_THRESHOLD;
- iga2_display_queue_expire_num =
- CX700_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K8M890) {
- iga2_fifo_max_depth = K8M890_IGA2_FIFO_MAX_DEPTH;
- iga2_fifo_threshold = K8M890_IGA2_FIFO_THRESHOLD;
- iga2_fifo_high_threshold =
- K8M890_IGA2_FIFO_HIGH_THRESHOLD;
- iga2_display_queue_expire_num =
- K8M890_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_P4M890) {
- iga2_fifo_max_depth = P4M890_IGA2_FIFO_MAX_DEPTH;
- iga2_fifo_threshold = P4M890_IGA2_FIFO_THRESHOLD;
- iga2_fifo_high_threshold =
- P4M890_IGA2_FIFO_HIGH_THRESHOLD;
- iga2_display_queue_expire_num =
- P4M890_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_P4M900) {
- iga2_fifo_max_depth = P4M900_IGA2_FIFO_MAX_DEPTH;
- iga2_fifo_threshold = P4M900_IGA2_FIFO_THRESHOLD;
- iga2_fifo_high_threshold =
- P4M900_IGA2_FIFO_HIGH_THRESHOLD;
- iga2_display_queue_expire_num =
- P4M900_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX800) {
- iga2_fifo_max_depth = VX800_IGA2_FIFO_MAX_DEPTH;
- iga2_fifo_threshold = VX800_IGA2_FIFO_THRESHOLD;
- iga2_fifo_high_threshold =
- VX800_IGA2_FIFO_HIGH_THRESHOLD;
- iga2_display_queue_expire_num =
- VX800_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX855) {
- iga2_fifo_max_depth = VX855_IGA2_FIFO_MAX_DEPTH;
- iga2_fifo_threshold = VX855_IGA2_FIFO_THRESHOLD;
- iga2_fifo_high_threshold =
- VX855_IGA2_FIFO_HIGH_THRESHOLD;
- iga2_display_queue_expire_num =
- VX855_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX900) {
- iga2_fifo_max_depth = VX900_IGA2_FIFO_MAX_DEPTH;
- iga2_fifo_threshold = VX900_IGA2_FIFO_THRESHOLD;
- iga2_fifo_high_threshold =
- VX900_IGA2_FIFO_HIGH_THRESHOLD;
- iga2_display_queue_expire_num =
- VX900_IGA2_DISPLAY_QUEUE_EXPIRE_NUM;
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800) {
- /* Set Display FIFO Depath Select */
- reg_value =
- IGA2_FIFO_DEPTH_SELECT_FORMULA(iga2_fifo_max_depth)
- - 1;
- /* Patch LCD in IGA2 case */
- viafb_load_reg_num =
- display_fifo_depth_reg.
- iga2_fifo_depth_select_reg.reg_num;
- reg =
- display_fifo_depth_reg.
- iga2_fifo_depth_select_reg.reg;
- viafb_load_reg(reg_value,
- viafb_load_reg_num, reg, VIACR);
- } else {
-
- /* Set Display FIFO Depath Select */
- reg_value =
- IGA2_FIFO_DEPTH_SELECT_FORMULA(iga2_fifo_max_depth);
- viafb_load_reg_num =
- display_fifo_depth_reg.
- iga2_fifo_depth_select_reg.reg_num;
- reg =
- display_fifo_depth_reg.
- iga2_fifo_depth_select_reg.reg;
- viafb_load_reg(reg_value,
- viafb_load_reg_num, reg, VIACR);
- }
-
- /* Set Display FIFO Threshold Select */
- reg_value = IGA2_FIFO_THRESHOLD_FORMULA(iga2_fifo_threshold);
- viafb_load_reg_num =
- fifo_threshold_select_reg.
- iga2_fifo_threshold_select_reg.reg_num;
- reg =
- fifo_threshold_select_reg.
- iga2_fifo_threshold_select_reg.reg;
- viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR);
-
- /* Set FIFO High Threshold Select */
- reg_value =
- IGA2_FIFO_HIGH_THRESHOLD_FORMULA(iga2_fifo_high_threshold);
- viafb_load_reg_num =
- fifo_high_threshold_select_reg.
- iga2_fifo_high_threshold_select_reg.reg_num;
- reg =
- fifo_high_threshold_select_reg.
- iga2_fifo_high_threshold_select_reg.reg;
- viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR);
-
- /* Set Display Queue Expire Num */
- reg_value =
- IGA2_DISPLAY_QUEUE_EXPIRE_NUM_FORMULA
- (iga2_display_queue_expire_num);
- viafb_load_reg_num =
- display_queue_expire_num_reg.
- iga2_display_queue_expire_num_reg.reg_num;
- reg =
- display_queue_expire_num_reg.
- iga2_display_queue_expire_num_reg.reg;
- viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR);
-
- }
-
-}
-
-static struct via_pll_config get_pll_config(struct pll_limit *limits, int size,
- int clk)
-{
- struct via_pll_config cur, up, down, best = {0, 1, 0};
- const u32 f0 = 14318180; /* X1 frequency */
- int i, f;
-
- for (i = 0; i < size; i++) {
- cur.rshift = limits[i].rshift;
- cur.divisor = limits[i].divisor;
- cur.multiplier = clk / ((f0 / cur.divisor)>>cur.rshift);
- f = abs(get_pll_output_frequency(f0, cur) - clk);
- up = down = cur;
- up.multiplier++;
- down.multiplier--;
- if (abs(get_pll_output_frequency(f0, up) - clk) < f)
- cur = up;
- else if (abs(get_pll_output_frequency(f0, down) - clk) < f)
- cur = down;
-
- if (cur.multiplier < limits[i].multiplier_min)
- cur.multiplier = limits[i].multiplier_min;
- else if (cur.multiplier > limits[i].multiplier_max)
- cur.multiplier = limits[i].multiplier_max;
-
- f = abs(get_pll_output_frequency(f0, cur) - clk);
- if (f < abs(get_pll_output_frequency(f0, best) - clk))
- best = cur;
- }
-
- return best;
-}
-
-static struct via_pll_config get_best_pll_config(int clk)
-{
- struct via_pll_config config;
-
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_CLE266:
- case UNICHROME_K400:
- config = get_pll_config(cle266_pll_limits,
- ARRAY_SIZE(cle266_pll_limits), clk);
- break;
- case UNICHROME_K800:
- case UNICHROME_PM800:
- case UNICHROME_CN700:
- config = get_pll_config(k800_pll_limits,
- ARRAY_SIZE(k800_pll_limits), clk);
- break;
- case UNICHROME_CX700:
- case UNICHROME_CN750:
- case UNICHROME_K8M890:
- case UNICHROME_P4M890:
- case UNICHROME_P4M900:
- case UNICHROME_VX800:
- config = get_pll_config(cx700_pll_limits,
- ARRAY_SIZE(cx700_pll_limits), clk);
- break;
- case UNICHROME_VX855:
- case UNICHROME_VX900:
- config = get_pll_config(vx855_pll_limits,
- ARRAY_SIZE(vx855_pll_limits), clk);
- break;
- }
-
- return config;
-}
-
-/* Set VCLK*/
-void viafb_set_vclock(u32 clk, int set_iga)
-{
- struct via_pll_config config = get_best_pll_config(clk);
-
- if (set_iga == IGA1)
- clock.set_primary_pll(config);
- if (set_iga == IGA2)
- clock.set_secondary_pll(config);
-
- /* Fire! */
- via_write_misc_reg_mask(0x0C, 0x0C); /* select external clock */
-}
-
-struct via_display_timing var_to_timing(const struct fb_var_screeninfo *var,
- u16 cxres, u16 cyres)
-{
- struct via_display_timing timing;
- u16 dx = (var->xres - cxres) / 2, dy = (var->yres - cyres) / 2;
-
- timing.hor_addr = cxres;
- timing.hor_sync_start = timing.hor_addr + var->right_margin + dx;
- timing.hor_sync_end = timing.hor_sync_start + var->hsync_len;
- timing.hor_total = timing.hor_sync_end + var->left_margin + dx;
- timing.hor_blank_start = timing.hor_addr + dx;
- timing.hor_blank_end = timing.hor_total - dx;
- timing.ver_addr = cyres;
- timing.ver_sync_start = timing.ver_addr + var->lower_margin + dy;
- timing.ver_sync_end = timing.ver_sync_start + var->vsync_len;
- timing.ver_total = timing.ver_sync_end + var->upper_margin + dy;
- timing.ver_blank_start = timing.ver_addr + dy;
- timing.ver_blank_end = timing.ver_total - dy;
- return timing;
-}
-
-void viafb_fill_crtc_timing(const struct fb_var_screeninfo *var,
- u16 cxres, u16 cyres, int iga)
-{
- struct via_display_timing crt_reg = var_to_timing(var,
- cxres ? cxres : var->xres, cyres ? cyres : var->yres);
-
- if (iga == IGA1)
- via_set_primary_timing(&crt_reg);
- else if (iga == IGA2)
- via_set_secondary_timing(&crt_reg);
-
- viafb_load_fetch_count_reg(var->xres, var->bits_per_pixel / 8, iga);
- if (viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266
- && viaparinfo->chip_info->gfx_chip_name != UNICHROME_K400)
- viafb_load_FIFO_reg(iga, var->xres, var->yres);
-
- viafb_set_vclock(PICOS2KHZ(var->pixclock) * 1000, iga);
-}
-
-void viafb_init_chip_info(int chip_type)
-{
- via_clock_init(&clock, chip_type);
- init_gfx_chip_info(chip_type);
- init_tmds_chip_info();
- init_lvds_chip_info();
-
- /*Set IGA path for each device */
- viafb_set_iga_path();
-
- viaparinfo->lvds_setting_info->display_method = viafb_lcd_dsp_method;
- viaparinfo->lvds_setting_info->lcd_mode = viafb_lcd_mode;
- viaparinfo->lvds_setting_info2->display_method =
- viaparinfo->lvds_setting_info->display_method;
- viaparinfo->lvds_setting_info2->lcd_mode =
- viaparinfo->lvds_setting_info->lcd_mode;
-}
-
-void viafb_update_device_setting(int hres, int vres, int bpp, int flag)
-{
- if (flag == 0) {
- viaparinfo->tmds_setting_info->h_active = hres;
- viaparinfo->tmds_setting_info->v_active = vres;
- } else {
-
- if (viaparinfo->tmds_setting_info->iga_path == IGA2) {
- viaparinfo->tmds_setting_info->h_active = hres;
- viaparinfo->tmds_setting_info->v_active = vres;
- }
-
- }
-}
-
-static void init_gfx_chip_info(int chip_type)
-{
- u8 tmp;
-
- viaparinfo->chip_info->gfx_chip_name = chip_type;
-
- /* Check revision of CLE266 Chip */
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
- /* CR4F only define in CLE266.CX chip */
- tmp = viafb_read_reg(VIACR, CR4F);
- viafb_write_reg(CR4F, VIACR, 0x55);
- if (viafb_read_reg(VIACR, CR4F) != 0x55)
- viaparinfo->chip_info->gfx_chip_revision =
- CLE266_REVISION_AX;
- else
- viaparinfo->chip_info->gfx_chip_revision =
- CLE266_REVISION_CX;
- /* restore orignal CR4F value */
- viafb_write_reg(CR4F, VIACR, tmp);
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) {
- tmp = viafb_read_reg(VIASR, SR43);
- DEBUG_MSG(KERN_INFO "SR43:%X\n", tmp);
- if (tmp & 0x02) {
- viaparinfo->chip_info->gfx_chip_revision =
- CX700_REVISION_700M2;
- } else if (tmp & 0x40) {
- viaparinfo->chip_info->gfx_chip_revision =
- CX700_REVISION_700M;
- } else {
- viaparinfo->chip_info->gfx_chip_revision =
- CX700_REVISION_700;
- }
- }
-
- /* Determine which 2D engine we have */
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_VX800:
- case UNICHROME_VX855:
- case UNICHROME_VX900:
- viaparinfo->chip_info->twod_engine = VIA_2D_ENG_M1;
- break;
- case UNICHROME_K8M890:
- case UNICHROME_P4M900:
- viaparinfo->chip_info->twod_engine = VIA_2D_ENG_H5;
- break;
- default:
- viaparinfo->chip_info->twod_engine = VIA_2D_ENG_H2;
- break;
- }
-}
-
-static void init_tmds_chip_info(void)
-{
- viafb_tmds_trasmitter_identify();
-
- if (INTERFACE_NONE == viaparinfo->chip_info->tmds_chip_info.
- output_interface) {
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_CX700:
- {
- /* we should check support by hardware layout.*/
- if ((viafb_display_hardware_layout ==
- HW_LAYOUT_DVI_ONLY)
- || (viafb_display_hardware_layout ==
- HW_LAYOUT_LCD_DVI)) {
- viaparinfo->chip_info->tmds_chip_info.
- output_interface = INTERFACE_TMDS;
- } else {
- viaparinfo->chip_info->tmds_chip_info.
- output_interface =
- INTERFACE_NONE;
- }
- break;
- }
- case UNICHROME_K8M890:
- case UNICHROME_P4M900:
- case UNICHROME_P4M890:
- /* TMDS on PCIE, we set DFPLOW as default. */
- viaparinfo->chip_info->tmds_chip_info.output_interface =
- INTERFACE_DFP_LOW;
- break;
- default:
- {
- /* set DVP1 default for DVI */
- viaparinfo->chip_info->tmds_chip_info
- .output_interface = INTERFACE_DVP1;
- }
- }
- }
-
- DEBUG_MSG(KERN_INFO "TMDS Chip = %d\n",
- viaparinfo->chip_info->tmds_chip_info.tmds_chip_name);
- viafb_init_dvi_size(&viaparinfo->shared->chip_info.tmds_chip_info,
- &viaparinfo->shared->tmds_setting_info);
-}
-
-static void init_lvds_chip_info(void)
-{
- viafb_lvds_trasmitter_identify();
- viafb_init_lcd_size();
- viafb_init_lvds_output_interface(&viaparinfo->chip_info->lvds_chip_info,
- viaparinfo->lvds_setting_info);
- if (viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) {
- viafb_init_lvds_output_interface(&viaparinfo->chip_info->
- lvds_chip_info2, viaparinfo->lvds_setting_info2);
- }
- /*If CX700,two singel LCD, we need to reassign
- LCD interface to different LVDS port */
- if ((UNICHROME_CX700 == viaparinfo->chip_info->gfx_chip_name)
- && (HW_LAYOUT_LCD1_LCD2 == viafb_display_hardware_layout)) {
- if ((INTEGRATED_LVDS == viaparinfo->chip_info->lvds_chip_info.
- lvds_chip_name) && (INTEGRATED_LVDS ==
- viaparinfo->chip_info->
- lvds_chip_info2.lvds_chip_name)) {
- viaparinfo->chip_info->lvds_chip_info.output_interface =
- INTERFACE_LVDS0;
- viaparinfo->chip_info->lvds_chip_info2.
- output_interface =
- INTERFACE_LVDS1;
- }
- }
-
- DEBUG_MSG(KERN_INFO "LVDS Chip = %d\n",
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name);
- DEBUG_MSG(KERN_INFO "LVDS1 output_interface = %d\n",
- viaparinfo->chip_info->lvds_chip_info.output_interface);
- DEBUG_MSG(KERN_INFO "LVDS2 output_interface = %d\n",
- viaparinfo->chip_info->lvds_chip_info.output_interface);
-}
-
-void viafb_init_dac(int set_iga)
-{
- int i;
- u8 tmp;
-
- if (set_iga == IGA1) {
- /* access Primary Display's LUT */
- viafb_write_reg_mask(SR1A, VIASR, 0x00, BIT0);
- /* turn off LCK */
- viafb_write_reg_mask(SR1B, VIASR, 0x00, BIT7 + BIT6);
- for (i = 0; i < 256; i++) {
- write_dac_reg(i, palLUT_table[i].red,
- palLUT_table[i].green,
- palLUT_table[i].blue);
- }
- /* turn on LCK */
- viafb_write_reg_mask(SR1B, VIASR, 0xC0, BIT7 + BIT6);
- } else {
- tmp = viafb_read_reg(VIACR, CR6A);
- /* access Secondary Display's LUT */
- viafb_write_reg_mask(CR6A, VIACR, 0x40, BIT6);
- viafb_write_reg_mask(SR1A, VIASR, 0x01, BIT0);
- for (i = 0; i < 256; i++) {
- write_dac_reg(i, palLUT_table[i].red,
- palLUT_table[i].green,
- palLUT_table[i].blue);
- }
- /* set IGA1 DAC for default */
- viafb_write_reg_mask(SR1A, VIASR, 0x00, BIT0);
- viafb_write_reg(CR6A, VIACR, tmp);
- }
-}
-
-static void device_screen_off(void)
-{
- /* turn off CRT screen (IGA1) */
- viafb_write_reg_mask(SR01, VIASR, 0x20, BIT5);
-}
-
-static void device_screen_on(void)
-{
- /* turn on CRT screen (IGA1) */
- viafb_write_reg_mask(SR01, VIASR, 0x00, BIT5);
-}
-
-static void set_display_channel(void)
-{
- /*If viafb_LCD2_ON, on cx700, internal lvds's information
- is keeped on lvds_setting_info2 */
- if (viafb_LCD2_ON &&
- viaparinfo->lvds_setting_info2->device_lcd_dualedge) {
- /* For dual channel LCD: */
- /* Set to Dual LVDS channel. */
- viafb_write_reg_mask(CRD2, VIACR, 0x20, BIT4 + BIT5);
- } else if (viafb_LCD_ON && viafb_DVI_ON) {
- /* For LCD+DFP: */
- /* Set to LVDS1 + TMDS channel. */
- viafb_write_reg_mask(CRD2, VIACR, 0x10, BIT4 + BIT5);
- } else if (viafb_DVI_ON) {
- /* Set to single TMDS channel. */
- viafb_write_reg_mask(CRD2, VIACR, 0x30, BIT4 + BIT5);
- } else if (viafb_LCD_ON) {
- if (viaparinfo->lvds_setting_info->device_lcd_dualedge) {
- /* For dual channel LCD: */
- /* Set to Dual LVDS channel. */
- viafb_write_reg_mask(CRD2, VIACR, 0x20, BIT4 + BIT5);
- } else {
- /* Set to LVDS0 + LVDS1 channel. */
- viafb_write_reg_mask(CRD2, VIACR, 0x00, BIT4 + BIT5);
- }
- }
-}
-
-static u8 get_sync(struct fb_var_screeninfo *var)
-{
- u8 polarity = 0;
-
- if (!(var->sync & FB_SYNC_HOR_HIGH_ACT))
- polarity |= VIA_HSYNC_NEGATIVE;
- if (!(var->sync & FB_SYNC_VERT_HIGH_ACT))
- polarity |= VIA_VSYNC_NEGATIVE;
- return polarity;
-}
-
-static void hw_init(void)
-{
- int i;
-
- inb(VIAStatus);
- outb(0x00, VIAAR);
-
- /* Write Common Setting for Video Mode */
- viafb_write_regx(common_vga, ARRAY_SIZE(common_vga));
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_CLE266:
- viafb_write_regx(CLE266_ModeXregs, NUM_TOTAL_CLE266_ModeXregs);
- break;
-
- case UNICHROME_K400:
- viafb_write_regx(KM400_ModeXregs, NUM_TOTAL_KM400_ModeXregs);
- break;
-
- case UNICHROME_K800:
- case UNICHROME_PM800:
- viafb_write_regx(CN400_ModeXregs, NUM_TOTAL_CN400_ModeXregs);
- break;
-
- case UNICHROME_CN700:
- case UNICHROME_K8M890:
- case UNICHROME_P4M890:
- case UNICHROME_P4M900:
- viafb_write_regx(CN700_ModeXregs, NUM_TOTAL_CN700_ModeXregs);
- break;
-
- case UNICHROME_CX700:
- case UNICHROME_VX800:
- viafb_write_regx(CX700_ModeXregs, NUM_TOTAL_CX700_ModeXregs);
- break;
-
- case UNICHROME_VX855:
- case UNICHROME_VX900:
- viafb_write_regx(VX855_ModeXregs, NUM_TOTAL_VX855_ModeXregs);
- break;
- }
-
- /* magic required on VX900 for correct modesetting on IGA1 */
- via_write_reg_mask(VIACR, 0x45, 0x00, 0x01);
-
- /* probably this should go to the scaling code one day */
- via_write_reg_mask(VIACR, 0xFD, 0, 0x80); /* VX900 hw scale on IGA2 */
- viafb_write_regx(scaling_parameters, ARRAY_SIZE(scaling_parameters));
-
- /* Fill VPIT Parameters */
- /* Write Misc Register */
- outb(VPIT.Misc, VIA_MISC_REG_WRITE);
-
- /* Write Sequencer */
- for (i = 1; i <= StdSR; i++)
- via_write_reg(VIASR, i, VPIT.SR[i - 1]);
-
- viafb_write_reg_mask(0x15, VIASR, 0xA2, 0xA2);
-
- /* Write Graphic Controller */
- for (i = 0; i < StdGR; i++)
- via_write_reg(VIAGR, i, VPIT.GR[i]);
-
- /* Write Attribute Controller */
- for (i = 0; i < StdAR; i++) {
- inb(VIAStatus);
- outb(i, VIAAR);
- outb(VPIT.AR[i], VIAAR);
- }
-
- inb(VIAStatus);
- outb(0x20, VIAAR);
-
- load_fix_bit_crtc_reg();
-}
-
-int viafb_setmode(void)
-{
- int j, cxres = 0, cyres = 0;
- int port;
- u32 devices = viaparinfo->shared->iga1_devices
- | viaparinfo->shared->iga2_devices;
- u8 value, index, mask;
- struct fb_var_screeninfo var2;
-
- device_screen_off();
- device_off();
- via_set_state(devices, VIA_STATE_OFF);
-
- hw_init();
-
- /* Update Patch Register */
-
- if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266
- || viaparinfo->chip_info->gfx_chip_name == UNICHROME_K400)
- && viafbinfo->var.xres == 1024 && viafbinfo->var.yres == 768) {
- for (j = 0; j < res_patch_table[0].table_length; j++) {
- index = res_patch_table[0].io_reg_table[j].index;
- port = res_patch_table[0].io_reg_table[j].port;
- value = res_patch_table[0].io_reg_table[j].value;
- mask = res_patch_table[0].io_reg_table[j].mask;
- viafb_write_reg_mask(index, port, value, mask);
- }
- }
-
- via_set_primary_pitch(viafbinfo->fix.line_length);
- via_set_secondary_pitch(viafb_dual_fb ? viafbinfo1->fix.line_length
- : viafbinfo->fix.line_length);
- via_set_primary_color_depth(viaparinfo->depth);
- via_set_secondary_color_depth(viafb_dual_fb ? viaparinfo1->depth
- : viaparinfo->depth);
- via_set_source(viaparinfo->shared->iga1_devices, IGA1);
- via_set_source(viaparinfo->shared->iga2_devices, IGA2);
- if (viaparinfo->shared->iga2_devices)
- enable_second_display_channel();
- else
- disable_second_display_channel();
-
- /* Update Refresh Rate Setting */
-
- /* Clear On Screen */
-
- if (viafb_dual_fb) {
- var2 = viafbinfo1->var;
- } else if (viafb_SAMM_ON) {
- viafb_fill_var_timing_info(&var2, viafb_get_best_mode(
- viafb_second_xres, viafb_second_yres, viafb_refresh1));
- cxres = viafbinfo->var.xres;
- cyres = viafbinfo->var.yres;
- var2.bits_per_pixel = viafbinfo->var.bits_per_pixel;
- }
-
- /* CRT set mode */
- if (viafb_CRT_ON) {
- if (viaparinfo->shared->iga2_devices & VIA_CRT
- && viafb_SAMM_ON)
- viafb_fill_crtc_timing(&var2, cxres, cyres, IGA2);
- else
- viafb_fill_crtc_timing(&viafbinfo->var, 0, 0,
- (viaparinfo->shared->iga1_devices & VIA_CRT)
- ? IGA1 : IGA2);
-
- /* Patch if set_hres is not 8 alignment (1366) to viafb_setmode
- to 8 alignment (1368),there is several pixels (2 pixels)
- on right side of screen. */
- if (viafbinfo->var.xres % 8) {
- viafb_unlock_crt();
- viafb_write_reg(CR02, VIACR,
- viafb_read_reg(VIACR, CR02) - 1);
- viafb_lock_crt();
- }
- }
-
- if (viafb_DVI_ON) {
- if (viaparinfo->shared->tmds_setting_info.iga_path == IGA2
- && viafb_SAMM_ON)
- viafb_dvi_set_mode(&var2, cxres, cyres, IGA2);
- else
- viafb_dvi_set_mode(&viafbinfo->var, 0, 0,
- viaparinfo->tmds_setting_info->iga_path);
- }
-
- if (viafb_LCD_ON) {
- if (viafb_SAMM_ON &&
- (viaparinfo->lvds_setting_info->iga_path == IGA2)) {
- viafb_lcd_set_mode(&var2, cxres, cyres,
- viaparinfo->lvds_setting_info,
- &viaparinfo->chip_info->lvds_chip_info);
- } else {
- /* IGA1 doesn't have LCD scaling, so set it center. */
- if (viaparinfo->lvds_setting_info->iga_path == IGA1) {
- viaparinfo->lvds_setting_info->display_method =
- LCD_CENTERING;
- }
- viafb_lcd_set_mode(&viafbinfo->var, 0, 0,
- viaparinfo->lvds_setting_info,
- &viaparinfo->chip_info->lvds_chip_info);
- }
- }
- if (viafb_LCD2_ON) {
- if (viafb_SAMM_ON &&
- (viaparinfo->lvds_setting_info2->iga_path == IGA2)) {
- viafb_lcd_set_mode(&var2, cxres, cyres,
- viaparinfo->lvds_setting_info2,
- &viaparinfo->chip_info->lvds_chip_info2);
- } else {
- /* IGA1 doesn't have LCD scaling, so set it center. */
- if (viaparinfo->lvds_setting_info2->iga_path == IGA1) {
- viaparinfo->lvds_setting_info2->display_method =
- LCD_CENTERING;
- }
- viafb_lcd_set_mode(&viafbinfo->var, 0, 0,
- viaparinfo->lvds_setting_info2,
- &viaparinfo->chip_info->lvds_chip_info2);
- }
- }
-
- if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700)
- && (viafb_LCD_ON || viafb_DVI_ON))
- set_display_channel();
-
- /* If set mode normally, save resolution information for hot-plug . */
- if (!viafb_hotplug) {
- viafb_hotplug_Xres = viafbinfo->var.xres;
- viafb_hotplug_Yres = viafbinfo->var.yres;
- viafb_hotplug_bpp = viafbinfo->var.bits_per_pixel;
- viafb_hotplug_refresh = viafb_refresh;
-
- if (viafb_DVI_ON)
- viafb_DeviceStatus = DVI_Device;
- else
- viafb_DeviceStatus = CRT_Device;
- }
- device_on();
- if (!viafb_SAMM_ON)
- via_set_sync_polarity(devices, get_sync(&viafbinfo->var));
- else {
- via_set_sync_polarity(viaparinfo->shared->iga1_devices,
- get_sync(&viafbinfo->var));
- via_set_sync_polarity(viaparinfo->shared->iga2_devices,
- get_sync(&var2));
- }
-
- clock.set_engine_pll_state(VIA_STATE_ON);
- clock.set_primary_clock_source(VIA_CLKSRC_X1, true);
- clock.set_secondary_clock_source(VIA_CLKSRC_X1, true);
-
-#ifdef CONFIG_FB_VIA_X_COMPATIBILITY
- clock.set_primary_pll_state(VIA_STATE_ON);
- clock.set_primary_clock_state(VIA_STATE_ON);
- clock.set_secondary_pll_state(VIA_STATE_ON);
- clock.set_secondary_clock_state(VIA_STATE_ON);
-#else
- if (viaparinfo->shared->iga1_devices) {
- clock.set_primary_pll_state(VIA_STATE_ON);
- clock.set_primary_clock_state(VIA_STATE_ON);
- } else {
- clock.set_primary_pll_state(VIA_STATE_OFF);
- clock.set_primary_clock_state(VIA_STATE_OFF);
- }
-
- if (viaparinfo->shared->iga2_devices) {
- clock.set_secondary_pll_state(VIA_STATE_ON);
- clock.set_secondary_clock_state(VIA_STATE_ON);
- } else {
- clock.set_secondary_pll_state(VIA_STATE_OFF);
- clock.set_secondary_clock_state(VIA_STATE_OFF);
- }
-#endif /*CONFIG_FB_VIA_X_COMPATIBILITY*/
-
- via_set_state(devices, VIA_STATE_ON);
- device_screen_on();
- return 1;
-}
-
-int viafb_get_refresh(int hres, int vres, u32 long_refresh)
-{
- const struct fb_videomode *best;
-
- best = viafb_get_best_mode(hres, vres, long_refresh);
- if (!best)
- return 60;
-
- if (abs(best->refresh - long_refresh) > 3) {
- if (hres == 1200 && vres == 900)
- return 49; /* OLPC DCON only supports 50 Hz */
- else
- return 60;
- }
-
- return best->refresh;
-}
-
-static void device_off(void)
-{
- viafb_dvi_disable();
- viafb_lcd_disable();
-}
-
-static void device_on(void)
-{
- if (viafb_DVI_ON == 1)
- viafb_dvi_enable();
- if (viafb_LCD_ON == 1)
- viafb_lcd_enable();
-}
-
-static void enable_second_display_channel(void)
-{
- /* to enable second display channel. */
- viafb_write_reg_mask(CR6A, VIACR, 0x00, BIT6);
- viafb_write_reg_mask(CR6A, VIACR, BIT7, BIT7);
- viafb_write_reg_mask(CR6A, VIACR, BIT6, BIT6);
-}
-
-static void disable_second_display_channel(void)
-{
- /* to disable second display channel. */
- viafb_write_reg_mask(CR6A, VIACR, 0x00, BIT6);
- viafb_write_reg_mask(CR6A, VIACR, 0x00, BIT7);
- viafb_write_reg_mask(CR6A, VIACR, BIT6, BIT6);
-}
-
-void viafb_set_dpa_gfx(int output_interface, struct GFX_DPA_SETTING\
- *p_gfx_dpa_setting)
-{
- switch (output_interface) {
- case INTERFACE_DVP0:
- {
- /* DVP0 Clock Polarity and Adjust: */
- viafb_write_reg_mask(CR96, VIACR,
- p_gfx_dpa_setting->DVP0, 0x0F);
-
- /* DVP0 Clock and Data Pads Driving: */
- viafb_write_reg_mask(SR1E, VIASR,
- p_gfx_dpa_setting->DVP0ClockDri_S, BIT2);
- viafb_write_reg_mask(SR2A, VIASR,
- p_gfx_dpa_setting->DVP0ClockDri_S1,
- BIT4);
- viafb_write_reg_mask(SR1B, VIASR,
- p_gfx_dpa_setting->DVP0DataDri_S, BIT1);
- viafb_write_reg_mask(SR2A, VIASR,
- p_gfx_dpa_setting->DVP0DataDri_S1, BIT5);
- break;
- }
-
- case INTERFACE_DVP1:
- {
- /* DVP1 Clock Polarity and Adjust: */
- viafb_write_reg_mask(CR9B, VIACR,
- p_gfx_dpa_setting->DVP1, 0x0F);
-
- /* DVP1 Clock and Data Pads Driving: */
- viafb_write_reg_mask(SR65, VIASR,
- p_gfx_dpa_setting->DVP1Driving, 0x0F);
- break;
- }
-
- case INTERFACE_DFP_HIGH:
- {
- viafb_write_reg_mask(CR97, VIACR,
- p_gfx_dpa_setting->DFPHigh, 0x0F);
- break;
- }
-
- case INTERFACE_DFP_LOW:
- {
- viafb_write_reg_mask(CR99, VIACR,
- p_gfx_dpa_setting->DFPLow, 0x0F);
- break;
- }
-
- case INTERFACE_DFP:
- {
- viafb_write_reg_mask(CR97, VIACR,
- p_gfx_dpa_setting->DFPHigh, 0x0F);
- viafb_write_reg_mask(CR99, VIACR,
- p_gfx_dpa_setting->DFPLow, 0x0F);
- break;
- }
- }
-}
-
-void viafb_fill_var_timing_info(struct fb_var_screeninfo *var,
- const struct fb_videomode *mode)
-{
- var->pixclock = mode->pixclock;
- var->xres = mode->xres;
- var->yres = mode->yres;
- var->left_margin = mode->left_margin;
- var->right_margin = mode->right_margin;
- var->hsync_len = mode->hsync_len;
- var->upper_margin = mode->upper_margin;
- var->lower_margin = mode->lower_margin;
- var->vsync_len = mode->vsync_len;
- var->sync = mode->sync;
-}
diff --git a/drivers/video/via/hw.h b/drivers/video/via/hw.h
deleted file mode 100644
index 3be073c58b03..000000000000
--- a/drivers/video/via/hw.h
+++ /dev/null
@@ -1,676 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __HW_H__
-#define __HW_H__
-
-#include <linux/seq_file.h>
-
-#include "viamode.h"
-#include "global.h"
-#include "via_modesetting.h"
-
-#define viafb_read_reg(p, i) via_read_reg(p, i)
-#define viafb_write_reg(i, p, d) via_write_reg(p, i, d)
-#define viafb_write_reg_mask(i, p, d, m) via_write_reg_mask(p, i, d, m)
-
-/* VIA output devices */
-#define VIA_LDVP0 0x00000001
-#define VIA_LDVP1 0x00000002
-#define VIA_DVP0 0x00000004
-#define VIA_CRT 0x00000010
-#define VIA_DVP1 0x00000020
-#define VIA_LVDS1 0x00000040
-#define VIA_LVDS2 0x00000080
-
-/* VIA output device power states */
-#define VIA_STATE_ON 0
-#define VIA_STATE_STANDBY 1
-#define VIA_STATE_SUSPEND 2
-#define VIA_STATE_OFF 3
-
-/* VIA output device sync polarity */
-#define VIA_HSYNC_NEGATIVE 0x01
-#define VIA_VSYNC_NEGATIVE 0x02
-
-/**********************************************************/
-/* Definition IGA2 Design Method of CRTC Shadow Registers */
-/**********************************************************/
-#define IGA2_HOR_TOTAL_SHADOW_FORMULA(x) ((x/8)-5)
-#define IGA2_HOR_BLANK_END_SHADOW_FORMULA(x, y) (((x+y)/8)-1)
-#define IGA2_VER_TOTAL_SHADOW_FORMULA(x) ((x)-2)
-#define IGA2_VER_ADDR_SHADOW_FORMULA(x) ((x)-1)
-#define IGA2_VER_BLANK_START_SHADOW_FORMULA(x) ((x)-1)
-#define IGA2_VER_BLANK_END_SHADOW_FORMULA(x, y) ((x+y)-1)
-#define IGA2_VER_SYNC_START_SHADOW_FORMULA(x) (x)
-#define IGA2_VER_SYNC_END_SHADOW_FORMULA(x, y) (x+y)
-
-/* Define Register Number for IGA2 Shadow CRTC Timing */
-
-/* location: {CR6D,0,7},{CR71,3,3} */
-#define IGA2_SHADOW_HOR_TOTAL_REG_NUM 2
-/* location: {CR6E,0,7} */
-#define IGA2_SHADOW_HOR_BLANK_END_REG_NUM 1
-/* location: {CR6F,0,7},{CR71,0,2} */
-#define IGA2_SHADOW_VER_TOTAL_REG_NUM 2
-/* location: {CR70,0,7},{CR71,4,6} */
-#define IGA2_SHADOW_VER_ADDR_REG_NUM 2
-/* location: {CR72,0,7},{CR74,4,6} */
-#define IGA2_SHADOW_VER_BLANK_START_REG_NUM 2
-/* location: {CR73,0,7},{CR74,0,2} */
-#define IGA2_SHADOW_VER_BLANK_END_REG_NUM 2
-/* location: {CR75,0,7},{CR76,4,6} */
-#define IGA2_SHADOW_VER_SYNC_START_REG_NUM 2
-/* location: {CR76,0,3} */
-#define IGA2_SHADOW_VER_SYNC_END_REG_NUM 1
-
-/* Define Fetch Count Register*/
-
-/* location: {SR1C,0,7},{SR1D,0,1} */
-#define IGA1_FETCH_COUNT_REG_NUM 2
-/* 16 bytes alignment. */
-#define IGA1_FETCH_COUNT_ALIGN_BYTE 16
-/* x: H resolution, y: color depth */
-#define IGA1_FETCH_COUNT_PATCH_VALUE 4
-#define IGA1_FETCH_COUNT_FORMULA(x, y) \
- (((x*y)/IGA1_FETCH_COUNT_ALIGN_BYTE) + IGA1_FETCH_COUNT_PATCH_VALUE)
-
-/* location: {CR65,0,7},{CR67,2,3} */
-#define IGA2_FETCH_COUNT_REG_NUM 2
-#define IGA2_FETCH_COUNT_ALIGN_BYTE 16
-#define IGA2_FETCH_COUNT_PATCH_VALUE 0
-#define IGA2_FETCH_COUNT_FORMULA(x, y) \
- (((x*y)/IGA2_FETCH_COUNT_ALIGN_BYTE) + IGA2_FETCH_COUNT_PATCH_VALUE)
-
-/* Staring Address*/
-
-/* location: {CR0C,0,7},{CR0D,0,7},{CR34,0,7},{CR48,0,1} */
-#define IGA1_STARTING_ADDR_REG_NUM 4
-/* location: {CR62,1,7},{CR63,0,7},{CR64,0,7} */
-#define IGA2_STARTING_ADDR_REG_NUM 3
-
-/* Define Display OFFSET*/
-/* These value are by HW suggested value*/
-/* location: {SR17,0,7} */
-#define K800_IGA1_FIFO_MAX_DEPTH 384
-/* location: {SR16,0,5},{SR16,7,7} */
-#define K800_IGA1_FIFO_THRESHOLD 328
-/* location: {SR18,0,5},{SR18,7,7} */
-#define K800_IGA1_FIFO_HIGH_THRESHOLD 296
-/* location: {SR22,0,4}. (128/4) =64, K800 must be set zero, */
- /* because HW only 5 bits */
-#define K800_IGA1_DISPLAY_QUEUE_EXPIRE_NUM 0
-
-/* location: {CR68,4,7},{CR94,7,7},{CR95,7,7} */
-#define K800_IGA2_FIFO_MAX_DEPTH 384
-/* location: {CR68,0,3},{CR95,4,6} */
-#define K800_IGA2_FIFO_THRESHOLD 328
-/* location: {CR92,0,3},{CR95,0,2} */
-#define K800_IGA2_FIFO_HIGH_THRESHOLD 296
-/* location: {CR94,0,6} */
-#define K800_IGA2_DISPLAY_QUEUE_EXPIRE_NUM 128
-
-/* location: {SR17,0,7} */
-#define P880_IGA1_FIFO_MAX_DEPTH 192
-/* location: {SR16,0,5},{SR16,7,7} */
-#define P880_IGA1_FIFO_THRESHOLD 128
-/* location: {SR18,0,5},{SR18,7,7} */
-#define P880_IGA1_FIFO_HIGH_THRESHOLD 64
-/* location: {SR22,0,4}. (128/4) =64, K800 must be set zero, */
- /* because HW only 5 bits */
-#define P880_IGA1_DISPLAY_QUEUE_EXPIRE_NUM 0
-
-/* location: {CR68,4,7},{CR94,7,7},{CR95,7,7} */
-#define P880_IGA2_FIFO_MAX_DEPTH 96
-/* location: {CR68,0,3},{CR95,4,6} */
-#define P880_IGA2_FIFO_THRESHOLD 64
-/* location: {CR92,0,3},{CR95,0,2} */
-#define P880_IGA2_FIFO_HIGH_THRESHOLD 32
-/* location: {CR94,0,6} */
-#define P880_IGA2_DISPLAY_QUEUE_EXPIRE_NUM 128
-
-/* VT3314 chipset*/
-
-/* location: {SR17,0,7} */
-#define CN700_IGA1_FIFO_MAX_DEPTH 96
-/* location: {SR16,0,5},{SR16,7,7} */
-#define CN700_IGA1_FIFO_THRESHOLD 80
-/* location: {SR18,0,5},{SR18,7,7} */
-#define CN700_IGA1_FIFO_HIGH_THRESHOLD 64
-/* location: {SR22,0,4}. (128/4) =64, P800 must be set zero,
- because HW only 5 bits */
-#define CN700_IGA1_DISPLAY_QUEUE_EXPIRE_NUM 0
-/* location: {CR68,4,7},{CR94,7,7},{CR95,7,7} */
-#define CN700_IGA2_FIFO_MAX_DEPTH 96
-/* location: {CR68,0,3},{CR95,4,6} */
-#define CN700_IGA2_FIFO_THRESHOLD 80
-/* location: {CR92,0,3},{CR95,0,2} */
-#define CN700_IGA2_FIFO_HIGH_THRESHOLD 32
-/* location: {CR94,0,6} */
-#define CN700_IGA2_DISPLAY_QUEUE_EXPIRE_NUM 128
-
-/* For VT3324, these values are suggested by HW */
-/* location: {SR17,0,7} */
-#define CX700_IGA1_FIFO_MAX_DEPTH 192
-/* location: {SR16,0,5},{SR16,7,7} */
-#define CX700_IGA1_FIFO_THRESHOLD 128
-/* location: {SR18,0,5},{SR18,7,7} */
-#define CX700_IGA1_FIFO_HIGH_THRESHOLD 128
-/* location: {SR22,0,4} */
-#define CX700_IGA1_DISPLAY_QUEUE_EXPIRE_NUM 124
-
-/* location: {CR68,4,7},{CR94,7,7},{CR95,7,7} */
-#define CX700_IGA2_FIFO_MAX_DEPTH 96
-/* location: {CR68,0,3},{CR95,4,6} */
-#define CX700_IGA2_FIFO_THRESHOLD 64
-/* location: {CR92,0,3},{CR95,0,2} */
-#define CX700_IGA2_FIFO_HIGH_THRESHOLD 32
-/* location: {CR94,0,6} */
-#define CX700_IGA2_DISPLAY_QUEUE_EXPIRE_NUM 128
-
-/* VT3336 chipset*/
-/* location: {SR17,0,7} */
-#define K8M890_IGA1_FIFO_MAX_DEPTH 360
-/* location: {SR16,0,5},{SR16,7,7} */
-#define K8M890_IGA1_FIFO_THRESHOLD 328
-/* location: {SR18,0,5},{SR18,7,7} */
-#define K8M890_IGA1_FIFO_HIGH_THRESHOLD 296
-/* location: {SR22,0,4}. */
-#define K8M890_IGA1_DISPLAY_QUEUE_EXPIRE_NUM 124
-
-/* location: {CR68,4,7},{CR94,7,7},{CR95,7,7} */
-#define K8M890_IGA2_FIFO_MAX_DEPTH 360
-/* location: {CR68,0,3},{CR95,4,6} */
-#define K8M890_IGA2_FIFO_THRESHOLD 328
-/* location: {CR92,0,3},{CR95,0,2} */
-#define K8M890_IGA2_FIFO_HIGH_THRESHOLD 296
-/* location: {CR94,0,6} */
-#define K8M890_IGA2_DISPLAY_QUEUE_EXPIRE_NUM 124
-
-/* VT3327 chipset*/
-/* location: {SR17,0,7} */
-#define P4M890_IGA1_FIFO_MAX_DEPTH 96
-/* location: {SR16,0,5},{SR16,7,7} */
-#define P4M890_IGA1_FIFO_THRESHOLD 76
-/* location: {SR18,0,5},{SR18,7,7} */
-#define P4M890_IGA1_FIFO_HIGH_THRESHOLD 64
-/* location: {SR22,0,4}. (32/4) =8 */
-#define P4M890_IGA1_DISPLAY_QUEUE_EXPIRE_NUM 32
-/* location: {CR68,4,7},{CR94,7,7},{CR95,7,7} */
-#define P4M890_IGA2_FIFO_MAX_DEPTH 96
-/* location: {CR68,0,3},{CR95,4,6} */
-#define P4M890_IGA2_FIFO_THRESHOLD 76
-/* location: {CR92,0,3},{CR95,0,2} */
-#define P4M890_IGA2_FIFO_HIGH_THRESHOLD 64
-/* location: {CR94,0,6} */
-#define P4M890_IGA2_DISPLAY_QUEUE_EXPIRE_NUM 32
-
-/* VT3364 chipset*/
-/* location: {SR17,0,7} */
-#define P4M900_IGA1_FIFO_MAX_DEPTH 96
-/* location: {SR16,0,5},{SR16,7,7} */
-#define P4M900_IGA1_FIFO_THRESHOLD 76
-/* location: {SR18,0,5},{SR18,7,7} */
-#define P4M900_IGA1_FIFO_HIGH_THRESHOLD 76
-/* location: {SR22,0,4}. */
-#define P4M900_IGA1_DISPLAY_QUEUE_EXPIRE_NUM 32
-/* location: {CR68,4,7},{CR94,7,7},{CR95,7,7} */
-#define P4M900_IGA2_FIFO_MAX_DEPTH 96
-/* location: {CR68,0,3},{CR95,4,6} */
-#define P4M900_IGA2_FIFO_THRESHOLD 76
-/* location: {CR92,0,3},{CR95,0,2} */
-#define P4M900_IGA2_FIFO_HIGH_THRESHOLD 76
-/* location: {CR94,0,6} */
-#define P4M900_IGA2_DISPLAY_QUEUE_EXPIRE_NUM 32
-
-/* For VT3353, these values are suggested by HW */
-/* location: {SR17,0,7} */
-#define VX800_IGA1_FIFO_MAX_DEPTH 192
-/* location: {SR16,0,5},{SR16,7,7} */
-#define VX800_IGA1_FIFO_THRESHOLD 152
-/* location: {SR18,0,5},{SR18,7,7} */
-#define VX800_IGA1_FIFO_HIGH_THRESHOLD 152
-/* location: {SR22,0,4} */
-#define VX800_IGA1_DISPLAY_QUEUE_EXPIRE_NUM 64
-/* location: {CR68,4,7},{CR94,7,7},{CR95,7,7} */
-#define VX800_IGA2_FIFO_MAX_DEPTH 96
-/* location: {CR68,0,3},{CR95,4,6} */
-#define VX800_IGA2_FIFO_THRESHOLD 64
-/* location: {CR92,0,3},{CR95,0,2} */
-#define VX800_IGA2_FIFO_HIGH_THRESHOLD 32
-/* location: {CR94,0,6} */
-#define VX800_IGA2_DISPLAY_QUEUE_EXPIRE_NUM 128
-
-/* For VT3409 */
-#define VX855_IGA1_FIFO_MAX_DEPTH 400
-#define VX855_IGA1_FIFO_THRESHOLD 320
-#define VX855_IGA1_FIFO_HIGH_THRESHOLD 320
-#define VX855_IGA1_DISPLAY_QUEUE_EXPIRE_NUM 160
-
-#define VX855_IGA2_FIFO_MAX_DEPTH 200
-#define VX855_IGA2_FIFO_THRESHOLD 160
-#define VX855_IGA2_FIFO_HIGH_THRESHOLD 160
-#define VX855_IGA2_DISPLAY_QUEUE_EXPIRE_NUM 320
-
-/* For VT3410 */
-#define VX900_IGA1_FIFO_MAX_DEPTH 400
-#define VX900_IGA1_FIFO_THRESHOLD 320
-#define VX900_IGA1_FIFO_HIGH_THRESHOLD 320
-#define VX900_IGA1_DISPLAY_QUEUE_EXPIRE_NUM 160
-
-#define VX900_IGA2_FIFO_MAX_DEPTH 192
-#define VX900_IGA2_FIFO_THRESHOLD 160
-#define VX900_IGA2_FIFO_HIGH_THRESHOLD 160
-#define VX900_IGA2_DISPLAY_QUEUE_EXPIRE_NUM 320
-
-#define IGA1_FIFO_DEPTH_SELECT_REG_NUM 1
-#define IGA1_FIFO_THRESHOLD_REG_NUM 2
-#define IGA1_FIFO_HIGH_THRESHOLD_REG_NUM 2
-#define IGA1_DISPLAY_QUEUE_EXPIRE_NUM_REG_NUM 1
-
-#define IGA2_FIFO_DEPTH_SELECT_REG_NUM 3
-#define IGA2_FIFO_THRESHOLD_REG_NUM 2
-#define IGA2_FIFO_HIGH_THRESHOLD_REG_NUM 2
-#define IGA2_DISPLAY_QUEUE_EXPIRE_NUM_REG_NUM 1
-
-#define IGA1_FIFO_DEPTH_SELECT_FORMULA(x) ((x/2)-1)
-#define IGA1_FIFO_THRESHOLD_FORMULA(x) (x/4)
-#define IGA1_DISPLAY_QUEUE_EXPIRE_NUM_FORMULA(x) (x/4)
-#define IGA1_FIFO_HIGH_THRESHOLD_FORMULA(x) (x/4)
-#define IGA2_FIFO_DEPTH_SELECT_FORMULA(x) (((x/2)/4)-1)
-#define IGA2_FIFO_THRESHOLD_FORMULA(x) (x/4)
-#define IGA2_DISPLAY_QUEUE_EXPIRE_NUM_FORMULA(x) (x/4)
-#define IGA2_FIFO_HIGH_THRESHOLD_FORMULA(x) (x/4)
-
-/************************************************************************/
-/* LCD Timing */
-/************************************************************************/
-
-/* 500 ms = 500000 us */
-#define LCD_POWER_SEQ_TD0 500000
-/* 50 ms = 50000 us */
-#define LCD_POWER_SEQ_TD1 50000
-/* 0 us */
-#define LCD_POWER_SEQ_TD2 0
-/* 210 ms = 210000 us */
-#define LCD_POWER_SEQ_TD3 210000
-/* 2^10 * (1/14.31818M) = 71.475 us (K400.revA) */
-#define CLE266_POWER_SEQ_UNIT 71
-/* 2^11 * (1/14.31818M) = 142.95 us (K400.revB) */
-#define K800_POWER_SEQ_UNIT 142
-/* 2^13 * (1/14.31818M) = 572.1 us */
-#define P880_POWER_SEQ_UNIT 572
-
-#define CLE266_POWER_SEQ_FORMULA(x) ((x)/CLE266_POWER_SEQ_UNIT)
-#define K800_POWER_SEQ_FORMULA(x) ((x)/K800_POWER_SEQ_UNIT)
-#define P880_POWER_SEQ_FORMULA(x) ((x)/P880_POWER_SEQ_UNIT)
-
-/* location: {CR8B,0,7},{CR8F,0,3} */
-#define LCD_POWER_SEQ_TD0_REG_NUM 2
-/* location: {CR8C,0,7},{CR8F,4,7} */
-#define LCD_POWER_SEQ_TD1_REG_NUM 2
-/* location: {CR8D,0,7},{CR90,0,3} */
-#define LCD_POWER_SEQ_TD2_REG_NUM 2
-/* location: {CR8E,0,7},{CR90,4,7} */
-#define LCD_POWER_SEQ_TD3_REG_NUM 2
-
-/* LCD Scaling factor*/
-/* x: indicate setting horizontal size*/
-/* y: indicate panel horizontal size*/
-
-/* Horizontal scaling factor 10 bits (2^10) */
-#define CLE266_LCD_HOR_SCF_FORMULA(x, y) (((x-1)*1024)/(y-1))
-/* Vertical scaling factor 10 bits (2^10) */
-#define CLE266_LCD_VER_SCF_FORMULA(x, y) (((x-1)*1024)/(y-1))
-/* Horizontal scaling factor 10 bits (2^12) */
-#define K800_LCD_HOR_SCF_FORMULA(x, y) (((x-1)*4096)/(y-1))
-/* Vertical scaling factor 10 bits (2^11) */
-#define K800_LCD_VER_SCF_FORMULA(x, y) (((x-1)*2048)/(y-1))
-
-/* location: {CR9F,0,1},{CR77,0,7},{CR79,4,5} */
-#define LCD_HOR_SCALING_FACTOR_REG_NUM 3
-/* location: {CR79,3,3},{CR78,0,7},{CR79,6,7} */
-#define LCD_VER_SCALING_FACTOR_REG_NUM 3
-/* location: {CR77,0,7},{CR79,4,5} */
-#define LCD_HOR_SCALING_FACTOR_REG_NUM_CLE 2
-/* location: {CR78,0,7},{CR79,6,7} */
-#define LCD_VER_SCALING_FACTOR_REG_NUM_CLE 2
-
-struct io_register {
- u8 io_addr;
- u8 start_bit;
- u8 end_bit;
-};
-
-/*****************************************************
-** Define IGA2 Shadow Display Timing ****
-*****************************************************/
-
-/* IGA2 Shadow Horizontal Total */
-struct iga2_shadow_hor_total {
- int reg_num;
- struct io_register reg[IGA2_SHADOW_HOR_TOTAL_REG_NUM];
-};
-
-/* IGA2 Shadow Horizontal Blank End */
-struct iga2_shadow_hor_blank_end {
- int reg_num;
- struct io_register reg[IGA2_SHADOW_HOR_BLANK_END_REG_NUM];
-};
-
-/* IGA2 Shadow Vertical Total */
-struct iga2_shadow_ver_total {
- int reg_num;
- struct io_register reg[IGA2_SHADOW_VER_TOTAL_REG_NUM];
-};
-
-/* IGA2 Shadow Vertical Addressable Video */
-struct iga2_shadow_ver_addr {
- int reg_num;
- struct io_register reg[IGA2_SHADOW_VER_ADDR_REG_NUM];
-};
-
-/* IGA2 Shadow Vertical Blank Start */
-struct iga2_shadow_ver_blank_start {
- int reg_num;
- struct io_register reg[IGA2_SHADOW_VER_BLANK_START_REG_NUM];
-};
-
-/* IGA2 Shadow Vertical Blank End */
-struct iga2_shadow_ver_blank_end {
- int reg_num;
- struct io_register reg[IGA2_SHADOW_VER_BLANK_END_REG_NUM];
-};
-
-/* IGA2 Shadow Vertical Sync Start */
-struct iga2_shadow_ver_sync_start {
- int reg_num;
- struct io_register reg[IGA2_SHADOW_VER_SYNC_START_REG_NUM];
-};
-
-/* IGA2 Shadow Vertical Sync End */
-struct iga2_shadow_ver_sync_end {
- int reg_num;
- struct io_register reg[IGA2_SHADOW_VER_SYNC_END_REG_NUM];
-};
-
-/* IGA1 Fetch Count Register */
-struct iga1_fetch_count {
- int reg_num;
- struct io_register reg[IGA1_FETCH_COUNT_REG_NUM];
-};
-
-/* IGA2 Fetch Count Register */
-struct iga2_fetch_count {
- int reg_num;
- struct io_register reg[IGA2_FETCH_COUNT_REG_NUM];
-};
-
-struct fetch_count {
- struct iga1_fetch_count iga1_fetch_count_reg;
- struct iga2_fetch_count iga2_fetch_count_reg;
-};
-
-/* Starting Address Register */
-struct iga1_starting_addr {
- int reg_num;
- struct io_register reg[IGA1_STARTING_ADDR_REG_NUM];
-};
-
-struct iga2_starting_addr {
- int reg_num;
- struct io_register reg[IGA2_STARTING_ADDR_REG_NUM];
-};
-
-struct starting_addr {
- struct iga1_starting_addr iga1_starting_addr_reg;
- struct iga2_starting_addr iga2_starting_addr_reg;
-};
-
-/* LCD Power Sequence Timer */
-struct lcd_pwd_seq_td0 {
- int reg_num;
- struct io_register reg[LCD_POWER_SEQ_TD0_REG_NUM];
-};
-
-struct lcd_pwd_seq_td1 {
- int reg_num;
- struct io_register reg[LCD_POWER_SEQ_TD1_REG_NUM];
-};
-
-struct lcd_pwd_seq_td2 {
- int reg_num;
- struct io_register reg[LCD_POWER_SEQ_TD2_REG_NUM];
-};
-
-struct lcd_pwd_seq_td3 {
- int reg_num;
- struct io_register reg[LCD_POWER_SEQ_TD3_REG_NUM];
-};
-
-struct _lcd_pwd_seq_timer {
- struct lcd_pwd_seq_td0 td0;
- struct lcd_pwd_seq_td1 td1;
- struct lcd_pwd_seq_td2 td2;
- struct lcd_pwd_seq_td3 td3;
-};
-
-/* LCD Scaling Factor */
-struct _lcd_hor_scaling_factor {
- int reg_num;
- struct io_register reg[LCD_HOR_SCALING_FACTOR_REG_NUM];
-};
-
-struct _lcd_ver_scaling_factor {
- int reg_num;
- struct io_register reg[LCD_VER_SCALING_FACTOR_REG_NUM];
-};
-
-struct _lcd_scaling_factor {
- struct _lcd_hor_scaling_factor lcd_hor_scaling_factor;
- struct _lcd_ver_scaling_factor lcd_ver_scaling_factor;
-};
-
-struct pll_limit {
- u16 multiplier_min;
- u16 multiplier_max;
- u8 divisor;
- u8 rshift;
-};
-
-struct rgbLUT {
- u8 red;
- u8 green;
- u8 blue;
-};
-
-struct lcd_pwd_seq_timer {
- u16 td0;
- u16 td1;
- u16 td2;
- u16 td3;
-};
-
-/* Display FIFO Relation Registers*/
-struct iga1_fifo_depth_select {
- int reg_num;
- struct io_register reg[IGA1_FIFO_DEPTH_SELECT_REG_NUM];
-};
-
-struct iga1_fifo_threshold_select {
- int reg_num;
- struct io_register reg[IGA1_FIFO_THRESHOLD_REG_NUM];
-};
-
-struct iga1_fifo_high_threshold_select {
- int reg_num;
- struct io_register reg[IGA1_FIFO_HIGH_THRESHOLD_REG_NUM];
-};
-
-struct iga1_display_queue_expire_num {
- int reg_num;
- struct io_register reg[IGA1_DISPLAY_QUEUE_EXPIRE_NUM_REG_NUM];
-};
-
-struct iga2_fifo_depth_select {
- int reg_num;
- struct io_register reg[IGA2_FIFO_DEPTH_SELECT_REG_NUM];
-};
-
-struct iga2_fifo_threshold_select {
- int reg_num;
- struct io_register reg[IGA2_FIFO_THRESHOLD_REG_NUM];
-};
-
-struct iga2_fifo_high_threshold_select {
- int reg_num;
- struct io_register reg[IGA2_FIFO_HIGH_THRESHOLD_REG_NUM];
-};
-
-struct iga2_display_queue_expire_num {
- int reg_num;
- struct io_register reg[IGA2_DISPLAY_QUEUE_EXPIRE_NUM_REG_NUM];
-};
-
-struct fifo_depth_select {
- struct iga1_fifo_depth_select iga1_fifo_depth_select_reg;
- struct iga2_fifo_depth_select iga2_fifo_depth_select_reg;
-};
-
-struct fifo_threshold_select {
- struct iga1_fifo_threshold_select iga1_fifo_threshold_select_reg;
- struct iga2_fifo_threshold_select iga2_fifo_threshold_select_reg;
-};
-
-struct fifo_high_threshold_select {
- struct iga1_fifo_high_threshold_select
- iga1_fifo_high_threshold_select_reg;
- struct iga2_fifo_high_threshold_select
- iga2_fifo_high_threshold_select_reg;
-};
-
-struct display_queue_expire_num {
- struct iga1_display_queue_expire_num
- iga1_display_queue_expire_num_reg;
- struct iga2_display_queue_expire_num
- iga2_display_queue_expire_num_reg;
-};
-
-struct iga2_shadow_crtc_timing {
- struct iga2_shadow_hor_total hor_total_shadow;
- struct iga2_shadow_hor_blank_end hor_blank_end_shadow;
- struct iga2_shadow_ver_total ver_total_shadow;
- struct iga2_shadow_ver_addr ver_addr_shadow;
- struct iga2_shadow_ver_blank_start ver_blank_start_shadow;
- struct iga2_shadow_ver_blank_end ver_blank_end_shadow;
- struct iga2_shadow_ver_sync_start ver_sync_start_shadow;
- struct iga2_shadow_ver_sync_end ver_sync_end_shadow;
-};
-
-/* device ID */
-#define CLE266_FUNCTION3 0x3123
-#define KM400_FUNCTION3 0x3205
-#define CN400_FUNCTION2 0x2259
-#define CN400_FUNCTION3 0x3259
-/* support VT3314 chipset */
-#define CN700_FUNCTION2 0x2314
-#define CN700_FUNCTION3 0x3208
-/* VT3324 chipset */
-#define CX700_FUNCTION2 0x2324
-#define CX700_FUNCTION3 0x3324
-/* VT3204 chipset*/
-#define KM800_FUNCTION3 0x3204
-/* VT3336 chipset*/
-#define KM890_FUNCTION3 0x3336
-/* VT3327 chipset*/
-#define P4M890_FUNCTION3 0x3327
-/* VT3293 chipset*/
-#define CN750_FUNCTION3 0x3208
-/* VT3364 chipset*/
-#define P4M900_FUNCTION3 0x3364
-/* VT3353 chipset*/
-#define VX800_FUNCTION3 0x3353
-/* VT3409 chipset*/
-#define VX855_FUNCTION3 0x3409
-/* VT3410 chipset*/
-#define VX900_FUNCTION3 0x3410
-
-struct IODATA {
- u8 Index;
- u8 Mask;
- u8 Data;
-};
-
-struct pci_device_id_info {
- u32 vendor;
- u32 device;
- u32 chip_index;
-};
-
-struct via_device_mapping {
- u32 device;
- const char *name;
-};
-
-extern int viafb_SAMM_ON;
-extern int viafb_dual_fb;
-extern int viafb_LCD2_ON;
-extern int viafb_LCD_ON;
-extern int viafb_DVI_ON;
-extern int viafb_hotplug;
-
-struct via_display_timing var_to_timing(const struct fb_var_screeninfo *var,
- u16 cxres, u16 cyres);
-void viafb_fill_crtc_timing(const struct fb_var_screeninfo *var,
- u16 cxres, u16 cyres, int iga);
-void viafb_set_vclock(u32 CLK, int set_iga);
-void viafb_load_reg(int timing_value, int viafb_load_reg_num,
- struct io_register *reg,
- int io_type);
-void via_set_source(u32 devices, u8 iga);
-void via_set_state(u32 devices, u8 state);
-void via_set_sync_polarity(u32 devices, u8 polarity);
-u32 via_parse_odev(char *input, char **end);
-void via_odev_to_seq(struct seq_file *m, u32 odev);
-void init_ad9389(void);
-/* Access I/O Function */
-void viafb_lock_crt(void);
-void viafb_unlock_crt(void);
-void viafb_load_fetch_count_reg(int h_addr, int bpp_byte, int set_iga);
-void viafb_write_regx(struct io_reg RegTable[], int ItemNum);
-void viafb_load_FIFO_reg(int set_iga, int hor_active, int ver_active);
-void viafb_set_dpa_gfx(int output_interface, struct GFX_DPA_SETTING\
- *p_gfx_dpa_setting);
-
-int viafb_setmode(void);
-void viafb_fill_var_timing_info(struct fb_var_screeninfo *var,
- const struct fb_videomode *mode);
-void viafb_init_chip_info(int chip_type);
-void viafb_init_dac(int set_iga);
-int viafb_get_refresh(int hres, int vres, u32 float_refresh);
-void viafb_update_device_setting(int hres, int vres, int bpp, int flag);
-
-void viafb_set_iga_path(void);
-void viafb_set_primary_color_register(u8 index, u8 red, u8 green, u8 blue);
-void viafb_set_secondary_color_register(u8 index, u8 red, u8 green, u8 blue);
-void viafb_get_fb_info(unsigned int *fb_base, unsigned int *fb_len);
-
-#endif /* __HW_H__ */
diff --git a/drivers/video/via/ioctl.c b/drivers/video/via/ioctl.c
deleted file mode 100644
index ea1c51428823..000000000000
--- a/drivers/video/via/ioctl.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include "global.h"
-
-int viafb_ioctl_get_viafb_info(u_long arg)
-{
- struct viafb_ioctl_info viainfo;
-
- memset(&viainfo, 0, sizeof(struct viafb_ioctl_info));
-
- viainfo.viafb_id = VIAID;
- viainfo.vendor_id = PCI_VIA_VENDOR_ID;
-
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_CLE266:
- viainfo.device_id = UNICHROME_CLE266_DID;
- break;
-
- case UNICHROME_K400:
- viainfo.device_id = UNICHROME_K400_DID;
- break;
-
- case UNICHROME_K800:
- viainfo.device_id = UNICHROME_K800_DID;
- break;
-
- case UNICHROME_PM800:
- viainfo.device_id = UNICHROME_PM800_DID;
- break;
-
- case UNICHROME_CN700:
- viainfo.device_id = UNICHROME_CN700_DID;
- break;
-
- case UNICHROME_CX700:
- viainfo.device_id = UNICHROME_CX700_DID;
- break;
-
- case UNICHROME_K8M890:
- viainfo.device_id = UNICHROME_K8M890_DID;
- break;
-
- case UNICHROME_P4M890:
- viainfo.device_id = UNICHROME_P4M890_DID;
- break;
-
- case UNICHROME_P4M900:
- viainfo.device_id = UNICHROME_P4M900_DID;
- break;
- }
-
- viainfo.version = VERSION_MAJOR;
- viainfo.revision = VERSION_MINOR;
-
- if (copy_to_user((void __user *)arg, &viainfo, sizeof(viainfo)))
- return -EFAULT;
-
- return 0;
-}
-
-/* Hot-Plug Priority: DVI > CRT*/
-int viafb_ioctl_hotplug(int hres, int vres, int bpp)
-{
- int DVIsense, status = 0;
- DEBUG_MSG(KERN_INFO "viafb_ioctl_hotplug!!\n");
-
- if (viaparinfo->chip_info->tmds_chip_info.tmds_chip_name !=
- NON_TMDS_TRANSMITTER) {
- DVIsense = viafb_dvi_sense();
-
- if (DVIsense) {
- DEBUG_MSG(KERN_INFO "DVI Attached...\n");
- if (viafb_DeviceStatus != DVI_Device) {
- viafb_DVI_ON = 1;
- viafb_CRT_ON = 0;
- viafb_LCD_ON = 0;
- viafb_DeviceStatus = DVI_Device;
- viafb_set_iga_path();
- return viafb_DeviceStatus;
- }
- status = 1;
- } else
- DEBUG_MSG(KERN_INFO "DVI De-attached...\n");
- }
-
- if ((viafb_DeviceStatus != CRT_Device) && (status == 0)) {
- viafb_CRT_ON = 1;
- viafb_DVI_ON = 0;
- viafb_LCD_ON = 0;
-
- viafb_DeviceStatus = CRT_Device;
- viafb_set_iga_path();
- return viafb_DeviceStatus;
- }
-
- return 0;
-}
diff --git a/drivers/video/via/ioctl.h b/drivers/video/via/ioctl.h
deleted file mode 100644
index 6010d10b59e8..000000000000
--- a/drivers/video/via/ioctl.h
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __IOCTL_H__
-#define __IOCTL_H__
-
-#ifndef __user
-#define __user
-#endif
-
-/* VIAFB IOCTL definition */
-#define VIAFB_GET_INFO_SIZE 0x56494101 /* 'VIA\01' */
-#define VIAFB_GET_INFO 0x56494102 /* 'VIA\02' */
-#define VIAFB_HOTPLUG 0x56494103 /* 'VIA\03' */
-#define VIAFB_SET_HOTPLUG_FLAG 0x56494104 /* 'VIA\04' */
-#define VIAFB_GET_RESOLUTION 0x56494105 /* 'VIA\05' */
-#define VIAFB_GET_SAMM_INFO 0x56494107 /* 'VIA\07' */
-#define VIAFB_TURN_ON_OUTPUT_DEVICE 0x56494108 /* 'VIA\08' */
-#define VIAFB_TURN_OFF_OUTPUT_DEVICE 0x56494109 /* 'VIA\09' */
-#define VIAFB_GET_DEVICE 0x5649410B
-#define VIAFB_GET_DRIVER_VERSION 0x56494112 /* 'VIA\12' */
-#define VIAFB_GET_CHIP_INFO 0x56494113 /* 'VIA\13' */
-#define VIAFB_GET_DEVICE_INFO 0x56494115
-
-#define VIAFB_GET_DEVICE_SUPPORT 0x56494118
-#define VIAFB_GET_DEVICE_CONNECT 0x56494119
-#define VIAFB_GET_PANEL_SUPPORT_EXPAND 0x5649411A
-#define VIAFB_GET_DRIVER_NAME 0x56494122
-#define VIAFB_GET_DEVICE_SUPPORT_STATE 0x56494123
-#define VIAFB_GET_GAMMA_LUT 0x56494124
-#define VIAFB_SET_GAMMA_LUT 0x56494125
-#define VIAFB_GET_GAMMA_SUPPORT_STATE 0x56494126
-#define VIAFB_SYNC_SURFACE 0x56494130
-#define VIAFB_GET_DRIVER_CAPS 0x56494131
-#define VIAFB_GET_IGA_SCALING_INFO 0x56494132
-#define VIAFB_GET_PANEL_MAX_SIZE 0x56494133
-#define VIAFB_GET_PANEL_MAX_POSITION 0x56494134
-#define VIAFB_SET_PANEL_SIZE 0x56494135
-#define VIAFB_SET_PANEL_POSITION 0x56494136
-#define VIAFB_GET_PANEL_POSITION 0x56494137
-#define VIAFB_GET_PANEL_SIZE 0x56494138
-
-#define None_Device 0x00
-#define CRT_Device 0x01
-#define LCD_Device 0x02
-#define DVI_Device 0x08
-#define CRT2_Device 0x10
-#define LCD2_Device 0x40
-
-#define OP_LCD_CENTERING 0x01
-#define OP_LCD_PANEL_ID 0x02
-#define OP_LCD_MODE 0x03
-
-/*SAMM operation flag*/
-#define OP_SAMM 0x80
-
-#define LCD_PANEL_ID_MAXIMUM 23
-
-#define STATE_ON 0x1
-#define STATE_OFF 0x0
-#define STATE_DEFAULT 0xFFFF
-
-#define MAX_ACTIVE_DEV_NUM 2
-
-struct device_t {
- unsigned short crt:1;
- unsigned short dvi:1;
- unsigned short lcd:1;
- unsigned short samm:1;
- unsigned short lcd_dsp_cent:1;
- unsigned char lcd_mode:1;
- unsigned short epia_dvi:1;
- unsigned short lcd_dual_edge:1;
- unsigned short lcd2:1;
-
- unsigned short primary_dev;
- unsigned char lcd_panel_id;
- unsigned short xres, yres;
- unsigned short xres1, yres1;
- unsigned short refresh;
- unsigned short bpp;
- unsigned short refresh1;
- unsigned short bpp1;
- unsigned short sequence;
- unsigned short bus_width;
-};
-
-struct viafb_ioctl_info {
- u32 viafb_id; /* for identifying viafb */
-#define VIAID 0x56494146 /* Identify myself with 'VIAF' */
- u16 vendor_id;
- u16 device_id;
- u8 version;
- u8 revision;
- u8 reserved[246]; /* for future use */
-};
-
-struct viafb_ioctl_mode {
- u32 xres;
- u32 yres;
- u32 refresh;
- u32 bpp;
- u32 xres_sec;
- u32 yres_sec;
- u32 virtual_xres_sec;
- u32 virtual_yres_sec;
- u32 refresh_sec;
- u32 bpp_sec;
-};
-struct viafb_ioctl_samm {
- u32 samm_status;
- u32 size_prim;
- u32 size_sec;
- u32 mem_base;
- u32 offset_sec;
-};
-
-struct viafb_driver_version {
- int iMajorNum;
- int iKernelNum;
- int iOSNum;
- int iMinorNum;
-};
-
-struct viafb_ioctl_lcd_attribute {
- unsigned int panel_id;
- unsigned int display_center;
- unsigned int lcd_mode;
-};
-
-struct viafb_ioctl_setting {
- /* Enable or disable active devices */
- unsigned short device_flag;
- /* Indicate which device should be turn on or turn off. */
- unsigned short device_status;
- unsigned int reserved;
- /* Indicate which LCD's attribute can be changed. */
- unsigned short lcd_operation_flag;
- /* 1: SAMM ON 0: SAMM OFF */
- unsigned short samm_status;
- /* horizontal resolution of first device */
- unsigned short first_dev_hor_res;
- /* vertical resolution of first device */
- unsigned short first_dev_ver_res;
- /* horizontal resolution of second device */
- unsigned short second_dev_hor_res;
- /* vertical resolution of second device */
- unsigned short second_dev_ver_res;
- /* refresh rate of first device */
- unsigned short first_dev_refresh;
- /* bpp of first device */
- unsigned short first_dev_bpp;
- /* refresh rate of second device */
- unsigned short second_dev_refresh;
- /* bpp of second device */
- unsigned short second_dev_bpp;
- /* Indicate which device are primary display device. */
- unsigned int primary_device;
- unsigned int struct_reserved[35];
- struct viafb_ioctl_lcd_attribute lcd_attributes;
-};
-
-struct _UTFunctionCaps {
- unsigned int dw3DScalingState;
- unsigned int reserved[31];
-};
-
-struct _POSITIONVALUE {
- unsigned int dwX;
- unsigned int dwY;
-};
-
-struct _panel_size_pos_info {
- unsigned int device_type;
- int x;
- int y;
-};
-
-extern int viafb_LCD_ON;
-extern int viafb_DVI_ON;
-
-int viafb_ioctl_get_viafb_info(u_long arg);
-int viafb_ioctl_hotplug(int hres, int vres, int bpp);
-
-#endif /* __IOCTL_H__ */
diff --git a/drivers/video/via/lcd.c b/drivers/video/via/lcd.c
deleted file mode 100644
index 5d21ff436ec8..000000000000
--- a/drivers/video/via/lcd.c
+++ /dev/null
@@ -1,1005 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-#include <linux/via-core.h>
-#include <linux/via_i2c.h>
-#include "global.h"
-
-#define viafb_compact_res(x, y) (((x)<<16)|(y))
-
-/* CLE266 Software Power Sequence */
-/* {Mask}, {Data}, {Delay} */
-static const int PowerSequenceOn[3][3] = {
- {0x10, 0x08, 0x06}, {0x10, 0x08, 0x06}, {0x19, 0x1FE, 0x01}
-};
-static const int PowerSequenceOff[3][3] = {
- {0x06, 0x08, 0x10}, {0x00, 0x00, 0x00}, {0xD2, 0x19, 0x01}
-};
-
-static struct _lcd_scaling_factor lcd_scaling_factor = {
- /* LCD Horizontal Scaling Factor Register */
- {LCD_HOR_SCALING_FACTOR_REG_NUM,
- {{CR9F, 0, 1}, {CR77, 0, 7}, {CR79, 4, 5} } },
- /* LCD Vertical Scaling Factor Register */
- {LCD_VER_SCALING_FACTOR_REG_NUM,
- {{CR79, 3, 3}, {CR78, 0, 7}, {CR79, 6, 7} } }
-};
-static struct _lcd_scaling_factor lcd_scaling_factor_CLE = {
- /* LCD Horizontal Scaling Factor Register */
- {LCD_HOR_SCALING_FACTOR_REG_NUM_CLE, {{CR77, 0, 7}, {CR79, 4, 5} } },
- /* LCD Vertical Scaling Factor Register */
- {LCD_VER_SCALING_FACTOR_REG_NUM_CLE, {{CR78, 0, 7}, {CR79, 6, 7} } }
-};
-
-static bool lvds_identify_integratedlvds(void);
-static void fp_id_to_vindex(int panel_id);
-static int lvds_register_read(int index);
-static void load_lcd_scaling(int set_hres, int set_vres, int panel_hres,
- int panel_vres);
-static void lcd_patch_skew_dvp0(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-static void lcd_patch_skew_dvp1(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-static void lcd_patch_skew(struct lvds_setting_information
- *plvds_setting_info, struct lvds_chip_information *plvds_chip_info);
-
-static void integrated_lvds_disable(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-static void integrated_lvds_enable(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-static void lcd_powersequence_off(void);
-static void lcd_powersequence_on(void);
-static void fill_lcd_format(void);
-static void check_diport_of_integrated_lvds(
- struct lvds_chip_information *plvds_chip_info,
- struct lvds_setting_information
- *plvds_setting_info);
-
-static inline bool check_lvds_chip(int device_id_subaddr, int device_id)
-{
- return lvds_register_read(device_id_subaddr) == device_id;
-}
-
-void viafb_init_lcd_size(void)
-{
- DEBUG_MSG(KERN_INFO "viafb_init_lcd_size()\n");
-
- fp_id_to_vindex(viafb_lcd_panel_id);
- viaparinfo->lvds_setting_info2->lcd_panel_hres =
- viaparinfo->lvds_setting_info->lcd_panel_hres;
- viaparinfo->lvds_setting_info2->lcd_panel_vres =
- viaparinfo->lvds_setting_info->lcd_panel_vres;
- viaparinfo->lvds_setting_info2->device_lcd_dualedge =
- viaparinfo->lvds_setting_info->device_lcd_dualedge;
- viaparinfo->lvds_setting_info2->LCDDithering =
- viaparinfo->lvds_setting_info->LCDDithering;
-}
-
-static bool lvds_identify_integratedlvds(void)
-{
- if (viafb_display_hardware_layout == HW_LAYOUT_LCD_EXTERNAL_LCD2) {
- /* Two dual channel LCD (Internal LVDS + External LVDS): */
- /* If we have an external LVDS, such as VT1636, we should
- have its chip ID already. */
- if (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name) {
- viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name =
- INTEGRATED_LVDS;
- DEBUG_MSG(KERN_INFO "Support two dual channel LVDS! "
- "(Internal LVDS + External LVDS)\n");
- } else {
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name =
- INTEGRATED_LVDS;
- DEBUG_MSG(KERN_INFO "Not found external LVDS, "
- "so can't support two dual channel LVDS!\n");
- }
- } else if (viafb_display_hardware_layout == HW_LAYOUT_LCD1_LCD2) {
- /* Two single channel LCD (Internal LVDS + Internal LVDS): */
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name =
- INTEGRATED_LVDS;
- viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name =
- INTEGRATED_LVDS;
- DEBUG_MSG(KERN_INFO "Support two single channel LVDS! "
- "(Internal LVDS + Internal LVDS)\n");
- } else if (viafb_display_hardware_layout != HW_LAYOUT_DVI_ONLY) {
- /* If we have found external LVDS, just use it,
- otherwise, we will use internal LVDS as default. */
- if (!viaparinfo->chip_info->lvds_chip_info.lvds_chip_name) {
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name =
- INTEGRATED_LVDS;
- DEBUG_MSG(KERN_INFO "Found Integrated LVDS!\n");
- }
- } else {
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name =
- NON_LVDS_TRANSMITTER;
- DEBUG_MSG(KERN_INFO "Do not support LVDS!\n");
- return false;
- }
-
- return true;
-}
-
-bool viafb_lvds_trasmitter_identify(void)
-{
- if (viafb_lvds_identify_vt1636(VIA_PORT_31)) {
- viaparinfo->chip_info->lvds_chip_info.i2c_port = VIA_PORT_31;
- DEBUG_MSG(KERN_INFO
- "Found VIA VT1636 LVDS on port i2c 0x31\n");
- } else {
- if (viafb_lvds_identify_vt1636(VIA_PORT_2C)) {
- viaparinfo->chip_info->lvds_chip_info.i2c_port =
- VIA_PORT_2C;
- DEBUG_MSG(KERN_INFO
- "Found VIA VT1636 LVDS on port gpio 0x2c\n");
- }
- }
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700)
- lvds_identify_integratedlvds();
-
- if (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name)
- return true;
- /* Check for VT1631: */
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name = VT1631_LVDS;
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_slave_addr =
- VT1631_LVDS_I2C_ADDR;
-
- if (check_lvds_chip(VT1631_DEVICE_ID_REG, VT1631_DEVICE_ID)) {
- DEBUG_MSG(KERN_INFO "\n VT1631 LVDS ! \n");
- DEBUG_MSG(KERN_INFO "\n %2d",
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name);
- DEBUG_MSG(KERN_INFO "\n %2d",
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name);
- return true;
- }
-
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name =
- NON_LVDS_TRANSMITTER;
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_slave_addr =
- VT1631_LVDS_I2C_ADDR;
- return false;
-}
-
-static void fp_id_to_vindex(int panel_id)
-{
- DEBUG_MSG(KERN_INFO "fp_get_panel_id()\n");
-
- if (panel_id > LCD_PANEL_ID_MAXIMUM)
- viafb_lcd_panel_id = panel_id =
- viafb_read_reg(VIACR, CR3F) & 0x0F;
-
- switch (panel_id) {
- case 0x0:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 640;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 480;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x1:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 600;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x2:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x3:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x4:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 1024;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x5:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1400;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 1050;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x6:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1600;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 1200;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x8:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 480;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x9:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0xA:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 0;
- break;
- case 0xB:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
- viaparinfo->lvds_setting_info->LCDDithering = 0;
- break;
- case 0xC:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 0;
- break;
- case 0xD:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 1024;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
- viaparinfo->lvds_setting_info->LCDDithering = 0;
- break;
- case 0xE:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1400;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 1050;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
- viaparinfo->lvds_setting_info->LCDDithering = 0;
- break;
- case 0xF:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1600;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 1200;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
- viaparinfo->lvds_setting_info->LCDDithering = 0;
- break;
- case 0x10:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1366;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 0;
- break;
- case 0x11:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 600;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x12:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x13:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 800;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x14:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1360;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 0;
- break;
- case 0x15:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
- viaparinfo->lvds_setting_info->LCDDithering = 0;
- break;
- case 0x16:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 480;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 640;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- break;
- case 0x17:
- /* OLPC XO-1.5 panel */
- viaparinfo->lvds_setting_info->lcd_panel_hres = 1200;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 900;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 0;
- break;
- default:
- viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
- viaparinfo->lvds_setting_info->lcd_panel_vres = 600;
- viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
- viaparinfo->lvds_setting_info->LCDDithering = 1;
- }
-}
-
-static int lvds_register_read(int index)
-{
- u8 data;
-
- viafb_i2c_readbyte(VIA_PORT_2C,
- (u8) viaparinfo->chip_info->lvds_chip_info.lvds_chip_slave_addr,
- (u8) index, &data);
- return data;
-}
-
-static void load_lcd_scaling(int set_hres, int set_vres, int panel_hres,
- int panel_vres)
-{
- int reg_value = 0;
- int viafb_load_reg_num;
- struct io_register *reg = NULL;
-
- DEBUG_MSG(KERN_INFO "load_lcd_scaling()!!\n");
-
- /* LCD Scaling Enable */
- viafb_write_reg_mask(CR79, VIACR, 0x07, BIT0 + BIT1 + BIT2);
-
- /* Check if expansion for horizontal */
- if (set_hres < panel_hres) {
- /* Load Horizontal Scaling Factor */
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_CLE266:
- case UNICHROME_K400:
- reg_value =
- CLE266_LCD_HOR_SCF_FORMULA(set_hres, panel_hres);
- viafb_load_reg_num =
- lcd_scaling_factor_CLE.lcd_hor_scaling_factor.
- reg_num;
- reg = lcd_scaling_factor_CLE.lcd_hor_scaling_factor.reg;
- viafb_load_reg(reg_value,
- viafb_load_reg_num, reg, VIACR);
- break;
- case UNICHROME_K800:
- case UNICHROME_PM800:
- case UNICHROME_CN700:
- case UNICHROME_CX700:
- case UNICHROME_K8M890:
- case UNICHROME_P4M890:
- case UNICHROME_P4M900:
- case UNICHROME_CN750:
- case UNICHROME_VX800:
- case UNICHROME_VX855:
- case UNICHROME_VX900:
- reg_value =
- K800_LCD_HOR_SCF_FORMULA(set_hres, panel_hres);
- /* Horizontal scaling enabled */
- viafb_write_reg_mask(CRA2, VIACR, 0xC0, BIT7 + BIT6);
- viafb_load_reg_num =
- lcd_scaling_factor.lcd_hor_scaling_factor.reg_num;
- reg = lcd_scaling_factor.lcd_hor_scaling_factor.reg;
- viafb_load_reg(reg_value,
- viafb_load_reg_num, reg, VIACR);
- break;
- }
-
- DEBUG_MSG(KERN_INFO "Horizontal Scaling value = %d", reg_value);
- } else {
- /* Horizontal scaling disabled */
- viafb_write_reg_mask(CRA2, VIACR, 0x00, BIT7);
- }
-
- /* Check if expansion for vertical */
- if (set_vres < panel_vres) {
- /* Load Vertical Scaling Factor */
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_CLE266:
- case UNICHROME_K400:
- reg_value =
- CLE266_LCD_VER_SCF_FORMULA(set_vres, panel_vres);
- viafb_load_reg_num =
- lcd_scaling_factor_CLE.lcd_ver_scaling_factor.
- reg_num;
- reg = lcd_scaling_factor_CLE.lcd_ver_scaling_factor.reg;
- viafb_load_reg(reg_value,
- viafb_load_reg_num, reg, VIACR);
- break;
- case UNICHROME_K800:
- case UNICHROME_PM800:
- case UNICHROME_CN700:
- case UNICHROME_CX700:
- case UNICHROME_K8M890:
- case UNICHROME_P4M890:
- case UNICHROME_P4M900:
- case UNICHROME_CN750:
- case UNICHROME_VX800:
- case UNICHROME_VX855:
- case UNICHROME_VX900:
- reg_value =
- K800_LCD_VER_SCF_FORMULA(set_vres, panel_vres);
- /* Vertical scaling enabled */
- viafb_write_reg_mask(CRA2, VIACR, 0x08, BIT3);
- viafb_load_reg_num =
- lcd_scaling_factor.lcd_ver_scaling_factor.reg_num;
- reg = lcd_scaling_factor.lcd_ver_scaling_factor.reg;
- viafb_load_reg(reg_value,
- viafb_load_reg_num, reg, VIACR);
- break;
- }
-
- DEBUG_MSG(KERN_INFO "Vertical Scaling value = %d", reg_value);
- } else {
- /* Vertical scaling disabled */
- viafb_write_reg_mask(CRA2, VIACR, 0x00, BIT3);
- }
-}
-
-static void via_pitch_alignment_patch_lcd(int iga_path, int hres, int bpp)
-{
- unsigned char cr13, cr35, cr65, cr66, cr67;
- unsigned long dwScreenPitch = 0;
- unsigned long dwPitch;
-
- dwPitch = hres * (bpp >> 3);
- if (dwPitch & 0x1F) {
- dwScreenPitch = ((dwPitch + 31) & ~31) >> 3;
- if (iga_path == IGA2) {
- if (bpp > 8) {
- cr66 = (unsigned char)(dwScreenPitch & 0xFF);
- viafb_write_reg(CR66, VIACR, cr66);
- cr67 = viafb_read_reg(VIACR, CR67) & 0xFC;
- cr67 |=
- (unsigned
- char)((dwScreenPitch & 0x300) >> 8);
- viafb_write_reg(CR67, VIACR, cr67);
- }
-
- /* Fetch Count */
- cr67 = viafb_read_reg(VIACR, CR67) & 0xF3;
- cr67 |= (unsigned char)((dwScreenPitch & 0x600) >> 7);
- viafb_write_reg(CR67, VIACR, cr67);
- cr65 = (unsigned char)((dwScreenPitch >> 1) & 0xFF);
- cr65 += 2;
- viafb_write_reg(CR65, VIACR, cr65);
- } else {
- if (bpp > 8) {
- cr13 = (unsigned char)(dwScreenPitch & 0xFF);
- viafb_write_reg(CR13, VIACR, cr13);
- cr35 = viafb_read_reg(VIACR, CR35) & 0x1F;
- cr35 |=
- (unsigned
- char)((dwScreenPitch & 0x700) >> 3);
- viafb_write_reg(CR35, VIACR, cr35);
- }
- }
- }
-}
-static void lcd_patch_skew_dvp0(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info)
-{
- if (VT1636_LVDS == plvds_chip_info->lvds_chip_name) {
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_P4M900:
- viafb_vt1636_patch_skew_on_vt3364(plvds_setting_info,
- plvds_chip_info);
- break;
- case UNICHROME_P4M890:
- viafb_vt1636_patch_skew_on_vt3327(plvds_setting_info,
- plvds_chip_info);
- break;
- }
- }
-}
-static void lcd_patch_skew_dvp1(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info)
-{
- if (VT1636_LVDS == plvds_chip_info->lvds_chip_name) {
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_CX700:
- viafb_vt1636_patch_skew_on_vt3324(plvds_setting_info,
- plvds_chip_info);
- break;
- }
- }
-}
-static void lcd_patch_skew(struct lvds_setting_information
- *plvds_setting_info, struct lvds_chip_information *plvds_chip_info)
-{
- DEBUG_MSG(KERN_INFO "lcd_patch_skew\n");
- switch (plvds_chip_info->output_interface) {
- case INTERFACE_DVP0:
- lcd_patch_skew_dvp0(plvds_setting_info, plvds_chip_info);
- break;
- case INTERFACE_DVP1:
- lcd_patch_skew_dvp1(plvds_setting_info, plvds_chip_info);
- break;
- case INTERFACE_DFP_LOW:
- if (UNICHROME_P4M900 == viaparinfo->chip_info->gfx_chip_name) {
- viafb_write_reg_mask(CR99, VIACR, 0x08,
- BIT0 + BIT1 + BIT2 + BIT3);
- }
- break;
- }
-}
-
-/* LCD Set Mode */
-void viafb_lcd_set_mode(const struct fb_var_screeninfo *var, u16 cxres,
- u16 cyres, struct lvds_setting_information *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info)
-{
- int set_iga = plvds_setting_info->iga_path;
- int mode_bpp = var->bits_per_pixel;
- int set_hres = cxres ? cxres : var->xres;
- int set_vres = cyres ? cyres : var->yres;
- int panel_hres = plvds_setting_info->lcd_panel_hres;
- int panel_vres = plvds_setting_info->lcd_panel_vres;
- u32 clock;
- struct via_display_timing timing;
- struct fb_var_screeninfo panel_var;
- const struct fb_videomode *mode_crt_table, *panel_crt_table;
-
- DEBUG_MSG(KERN_INFO "viafb_lcd_set_mode!!\n");
- /* Get mode table */
- mode_crt_table = viafb_get_best_mode(set_hres, set_vres, 60);
- /* Get panel table Pointer */
- panel_crt_table = viafb_get_best_mode(panel_hres, panel_vres, 60);
- viafb_fill_var_timing_info(&panel_var, panel_crt_table);
- DEBUG_MSG(KERN_INFO "bellow viafb_lcd_set_mode!!\n");
- if (VT1636_LVDS == plvds_chip_info->lvds_chip_name)
- viafb_init_lvds_vt1636(plvds_setting_info, plvds_chip_info);
- clock = PICOS2KHZ(panel_crt_table->pixclock) * 1000;
- plvds_setting_info->vclk = clock;
-
- if (set_iga == IGA2 && (set_hres < panel_hres || set_vres < panel_vres)
- && plvds_setting_info->display_method == LCD_EXPANDSION) {
- timing = var_to_timing(&panel_var, panel_hres, panel_vres);
- load_lcd_scaling(set_hres, set_vres, panel_hres, panel_vres);
- } else {
- timing = var_to_timing(&panel_var, set_hres, set_vres);
- if (set_iga == IGA2)
- /* disable scaling */
- via_write_reg_mask(VIACR, 0x79, 0x00,
- BIT0 + BIT1 + BIT2);
- }
-
- if (set_iga == IGA1)
- via_set_primary_timing(&timing);
- else if (set_iga == IGA2)
- via_set_secondary_timing(&timing);
-
- /* Fetch count for IGA2 only */
- viafb_load_fetch_count_reg(set_hres, mode_bpp / 8, set_iga);
-
- if ((viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266)
- && (viaparinfo->chip_info->gfx_chip_name != UNICHROME_K400))
- viafb_load_FIFO_reg(set_iga, set_hres, set_vres);
-
- fill_lcd_format();
- viafb_set_vclock(clock, set_iga);
- lcd_patch_skew(plvds_setting_info, plvds_chip_info);
-
- /* If K8M800, enable LCD Prefetch Mode. */
- if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800)
- || (UNICHROME_K8M890 == viaparinfo->chip_info->gfx_chip_name))
- viafb_write_reg_mask(CR6A, VIACR, 0x01, BIT0);
-
- /* Patch for non 32bit alignment mode */
- via_pitch_alignment_patch_lcd(plvds_setting_info->iga_path, set_hres,
- var->bits_per_pixel);
-}
-
-static void integrated_lvds_disable(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info)
-{
- bool turn_off_first_powersequence = false;
- bool turn_off_second_powersequence = false;
- if (INTERFACE_LVDS0LVDS1 == plvds_chip_info->output_interface)
- turn_off_first_powersequence = true;
- if (INTERFACE_LVDS0 == plvds_chip_info->output_interface)
- turn_off_first_powersequence = true;
- if (INTERFACE_LVDS1 == plvds_chip_info->output_interface)
- turn_off_second_powersequence = true;
- if (turn_off_second_powersequence) {
- /* Use second power sequence control: */
-
- /* Turn off power sequence. */
- viafb_write_reg_mask(CRD4, VIACR, 0, BIT1);
-
- /* Turn off back light. */
- viafb_write_reg_mask(CRD3, VIACR, 0xC0, BIT6 + BIT7);
- }
- if (turn_off_first_powersequence) {
- /* Use first power sequence control: */
-
- /* Turn off power sequence. */
- viafb_write_reg_mask(CR6A, VIACR, 0, BIT3);
-
- /* Turn off back light. */
- viafb_write_reg_mask(CR91, VIACR, 0xC0, BIT6 + BIT7);
- }
-
- /* Power off LVDS channel. */
- switch (plvds_chip_info->output_interface) {
- case INTERFACE_LVDS0:
- {
- viafb_write_reg_mask(CRD2, VIACR, 0x80, BIT7);
- break;
- }
-
- case INTERFACE_LVDS1:
- {
- viafb_write_reg_mask(CRD2, VIACR, 0x40, BIT6);
- break;
- }
-
- case INTERFACE_LVDS0LVDS1:
- {
- viafb_write_reg_mask(CRD2, VIACR, 0xC0, BIT6 + BIT7);
- break;
- }
- }
-}
-
-static void integrated_lvds_enable(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info)
-{
- DEBUG_MSG(KERN_INFO "integrated_lvds_enable, out_interface:%d\n",
- plvds_chip_info->output_interface);
- if (plvds_setting_info->lcd_mode == LCD_SPWG)
- viafb_write_reg_mask(CRD2, VIACR, 0x00, BIT0 + BIT1);
- else
- viafb_write_reg_mask(CRD2, VIACR, 0x03, BIT0 + BIT1);
-
- switch (plvds_chip_info->output_interface) {
- case INTERFACE_LVDS0LVDS1:
- case INTERFACE_LVDS0:
- /* Use first power sequence control: */
- /* Use hardware control power sequence. */
- viafb_write_reg_mask(CR91, VIACR, 0, BIT0);
- /* Turn on back light. */
- viafb_write_reg_mask(CR91, VIACR, 0, BIT6 + BIT7);
- /* Turn on hardware power sequence. */
- viafb_write_reg_mask(CR6A, VIACR, 0x08, BIT3);
- break;
- case INTERFACE_LVDS1:
- /* Use second power sequence control: */
- /* Use hardware control power sequence. */
- viafb_write_reg_mask(CRD3, VIACR, 0, BIT0);
- /* Turn on back light. */
- viafb_write_reg_mask(CRD3, VIACR, 0, BIT6 + BIT7);
- /* Turn on hardware power sequence. */
- viafb_write_reg_mask(CRD4, VIACR, 0x02, BIT1);
- break;
- }
-
- /* Power on LVDS channel. */
- switch (plvds_chip_info->output_interface) {
- case INTERFACE_LVDS0:
- {
- viafb_write_reg_mask(CRD2, VIACR, 0, BIT7);
- break;
- }
-
- case INTERFACE_LVDS1:
- {
- viafb_write_reg_mask(CRD2, VIACR, 0, BIT6);
- break;
- }
-
- case INTERFACE_LVDS0LVDS1:
- {
- viafb_write_reg_mask(CRD2, VIACR, 0, BIT6 + BIT7);
- break;
- }
- }
-}
-
-void viafb_lcd_disable(void)
-{
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
- lcd_powersequence_off();
- /* DI1 pad off */
- viafb_write_reg_mask(SR1E, VIASR, 0x00, 0x30);
- } else if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) {
- if (viafb_LCD2_ON
- && (INTEGRATED_LVDS ==
- viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name))
- integrated_lvds_disable(viaparinfo->lvds_setting_info,
- &viaparinfo->chip_info->lvds_chip_info2);
- if (INTEGRATED_LVDS ==
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name)
- integrated_lvds_disable(viaparinfo->lvds_setting_info,
- &viaparinfo->chip_info->lvds_chip_info);
- if (VT1636_LVDS == viaparinfo->chip_info->
- lvds_chip_info.lvds_chip_name)
- viafb_disable_lvds_vt1636(viaparinfo->lvds_setting_info,
- &viaparinfo->chip_info->lvds_chip_info);
- } else if (VT1636_LVDS ==
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name) {
- viafb_disable_lvds_vt1636(viaparinfo->lvds_setting_info,
- &viaparinfo->chip_info->lvds_chip_info);
- } else {
- /* Backlight off */
- viafb_write_reg_mask(SR3D, VIASR, 0x00, 0x20);
- /* 24 bit DI data paht off */
- viafb_write_reg_mask(CR91, VIACR, 0x80, 0x80);
- }
-
- /* Disable expansion bit */
- viafb_write_reg_mask(CR79, VIACR, 0x00, 0x01);
- /* Simultaneout disabled */
- viafb_write_reg_mask(CR6B, VIACR, 0x00, 0x08);
-}
-
-static void set_lcd_output_path(int set_iga, int output_interface)
-{
- switch (output_interface) {
- case INTERFACE_DFP:
- if ((UNICHROME_K8M890 == viaparinfo->chip_info->gfx_chip_name)
- || (UNICHROME_P4M890 ==
- viaparinfo->chip_info->gfx_chip_name))
- viafb_write_reg_mask(CR97, VIACR, 0x84,
- BIT7 + BIT2 + BIT1 + BIT0);
- case INTERFACE_DVP0:
- case INTERFACE_DVP1:
- case INTERFACE_DFP_HIGH:
- case INTERFACE_DFP_LOW:
- if (set_iga == IGA2)
- viafb_write_reg(CR91, VIACR, 0x00);
- break;
- }
-}
-
-void viafb_lcd_enable(void)
-{
- viafb_write_reg_mask(CR6B, VIACR, 0x00, BIT3);
- viafb_write_reg_mask(CR6A, VIACR, 0x08, BIT3);
- set_lcd_output_path(viaparinfo->lvds_setting_info->iga_path,
- viaparinfo->chip_info->lvds_chip_info.output_interface);
- if (viafb_LCD2_ON)
- set_lcd_output_path(viaparinfo->lvds_setting_info2->iga_path,
- viaparinfo->chip_info->
- lvds_chip_info2.output_interface);
-
- if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {
- /* DI1 pad on */
- viafb_write_reg_mask(SR1E, VIASR, 0x30, 0x30);
- lcd_powersequence_on();
- } else if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) {
- if (viafb_LCD2_ON && (INTEGRATED_LVDS ==
- viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name))
- integrated_lvds_enable(viaparinfo->lvds_setting_info2, \
- &viaparinfo->chip_info->lvds_chip_info2);
- if (INTEGRATED_LVDS ==
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name)
- integrated_lvds_enable(viaparinfo->lvds_setting_info,
- &viaparinfo->chip_info->lvds_chip_info);
- if (VT1636_LVDS == viaparinfo->chip_info->
- lvds_chip_info.lvds_chip_name)
- viafb_enable_lvds_vt1636(viaparinfo->
- lvds_setting_info, &viaparinfo->chip_info->
- lvds_chip_info);
- } else if (VT1636_LVDS ==
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name) {
- viafb_enable_lvds_vt1636(viaparinfo->lvds_setting_info,
- &viaparinfo->chip_info->lvds_chip_info);
- } else {
- /* Backlight on */
- viafb_write_reg_mask(SR3D, VIASR, 0x20, 0x20);
- /* 24 bit DI data paht on */
- viafb_write_reg_mask(CR91, VIACR, 0x00, 0x80);
- /* LCD enabled */
- viafb_write_reg_mask(CR6A, VIACR, 0x48, 0x48);
- }
-}
-
-static void lcd_powersequence_off(void)
-{
- int i, mask, data;
-
- /* Software control power sequence */
- viafb_write_reg_mask(CR91, VIACR, 0x11, 0x11);
-
- for (i = 0; i < 3; i++) {
- mask = PowerSequenceOff[0][i];
- data = PowerSequenceOff[1][i] & mask;
- viafb_write_reg_mask(CR91, VIACR, (u8) data, (u8) mask);
- udelay(PowerSequenceOff[2][i]);
- }
-
- /* Disable LCD */
- viafb_write_reg_mask(CR6A, VIACR, 0x00, 0x08);
-}
-
-static void lcd_powersequence_on(void)
-{
- int i, mask, data;
-
- /* Software control power sequence */
- viafb_write_reg_mask(CR91, VIACR, 0x11, 0x11);
-
- /* Enable LCD */
- viafb_write_reg_mask(CR6A, VIACR, 0x08, 0x08);
-
- for (i = 0; i < 3; i++) {
- mask = PowerSequenceOn[0][i];
- data = PowerSequenceOn[1][i] & mask;
- viafb_write_reg_mask(CR91, VIACR, (u8) data, (u8) mask);
- udelay(PowerSequenceOn[2][i]);
- }
-
- udelay(1);
-}
-
-static void fill_lcd_format(void)
-{
- u8 bdithering = 0, bdual = 0;
-
- if (viaparinfo->lvds_setting_info->device_lcd_dualedge)
- bdual = BIT4;
- if (viaparinfo->lvds_setting_info->LCDDithering)
- bdithering = BIT0;
- /* Dual & Dithering */
- viafb_write_reg_mask(CR88, VIACR, (bdithering | bdual), BIT4 + BIT0);
-}
-
-static void check_diport_of_integrated_lvds(
- struct lvds_chip_information *plvds_chip_info,
- struct lvds_setting_information
- *plvds_setting_info)
-{
- /* Determine LCD DI Port by hardware layout. */
- switch (viafb_display_hardware_layout) {
- case HW_LAYOUT_LCD_ONLY:
- {
- if (plvds_setting_info->device_lcd_dualedge) {
- plvds_chip_info->output_interface =
- INTERFACE_LVDS0LVDS1;
- } else {
- plvds_chip_info->output_interface =
- INTERFACE_LVDS0;
- }
-
- break;
- }
-
- case HW_LAYOUT_DVI_ONLY:
- {
- plvds_chip_info->output_interface = INTERFACE_NONE;
- break;
- }
-
- case HW_LAYOUT_LCD1_LCD2:
- case HW_LAYOUT_LCD_EXTERNAL_LCD2:
- {
- plvds_chip_info->output_interface =
- INTERFACE_LVDS0LVDS1;
- break;
- }
-
- case HW_LAYOUT_LCD_DVI:
- {
- plvds_chip_info->output_interface = INTERFACE_LVDS1;
- break;
- }
-
- default:
- {
- plvds_chip_info->output_interface = INTERFACE_LVDS1;
- break;
- }
- }
-
- DEBUG_MSG(KERN_INFO
- "Display Hardware Layout: 0x%x, LCD DI Port: 0x%x\n",
- viafb_display_hardware_layout,
- plvds_chip_info->output_interface);
-}
-
-void viafb_init_lvds_output_interface(struct lvds_chip_information
- *plvds_chip_info,
- struct lvds_setting_information
- *plvds_setting_info)
-{
- if (INTERFACE_NONE != plvds_chip_info->output_interface) {
- /*Do nothing, lcd port is specified by module parameter */
- return;
- }
-
- switch (plvds_chip_info->lvds_chip_name) {
-
- case VT1636_LVDS:
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_CX700:
- plvds_chip_info->output_interface = INTERFACE_DVP1;
- break;
- case UNICHROME_CN700:
- plvds_chip_info->output_interface = INTERFACE_DFP_LOW;
- break;
- default:
- plvds_chip_info->output_interface = INTERFACE_DVP0;
- break;
- }
- break;
-
- case INTEGRATED_LVDS:
- check_diport_of_integrated_lvds(plvds_chip_info,
- plvds_setting_info);
- break;
-
- default:
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_K8M890:
- case UNICHROME_P4M900:
- case UNICHROME_P4M890:
- plvds_chip_info->output_interface = INTERFACE_DFP_LOW;
- break;
- default:
- plvds_chip_info->output_interface = INTERFACE_DFP;
- break;
- }
- break;
- }
-}
-
-bool viafb_lcd_get_mobile_state(bool *mobile)
-{
- unsigned char __iomem *romptr, *tableptr, *biosptr;
- u8 core_base;
- /* Rom address */
- const u32 romaddr = 0x000C0000;
- u16 start_pattern;
-
- biosptr = ioremap(romaddr, 0x10000);
- start_pattern = readw(biosptr);
-
- /* Compare pattern */
- if (start_pattern == 0xAA55) {
- /* Get the start of Table */
- /* 0x1B means BIOS offset position */
- romptr = biosptr + 0x1B;
- tableptr = biosptr + readw(romptr);
-
- /* Get the start of biosver structure */
- /* 18 means BIOS version position. */
- romptr = tableptr + 18;
- romptr = biosptr + readw(romptr);
-
- /* The offset should be 44, but the
- actual image is less three char. */
- /* pRom += 44; */
- romptr += 41;
-
- core_base = readb(romptr);
-
- if (core_base & 0x8)
- *mobile = false;
- else
- *mobile = true;
- /* release memory */
- iounmap(biosptr);
-
- return true;
- } else {
- iounmap(biosptr);
- return false;
- }
-}
diff --git a/drivers/video/via/lcd.h b/drivers/video/via/lcd.h
deleted file mode 100644
index 5c988a063ad5..000000000000
--- a/drivers/video/via/lcd.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-#ifndef __LCD_H__
-#define __LCD_H__
-
-/*Definition TMDS Device ID register*/
-#define VT1631_DEVICE_ID_REG 0x02
-#define VT1631_DEVICE_ID 0x92
-
-#define VT3271_DEVICE_ID_REG 0x02
-#define VT3271_DEVICE_ID 0x71
-
-/* Definition DVI Panel ID*/
-/* Resolution: 640x480, Channel: single, Dithering: Enable */
-#define LCD_PANEL_ID0_640X480 0x00
-/* Resolution: 800x600, Channel: single, Dithering: Enable */
-#define LCD_PANEL_ID1_800X600 0x01
-/* Resolution: 1024x768, Channel: single, Dithering: Enable */
-#define LCD_PANEL_ID2_1024X768 0x02
-/* Resolution: 1280x768, Channel: single, Dithering: Enable */
-#define LCD_PANEL_ID3_1280X768 0x03
-/* Resolution: 1280x1024, Channel: dual, Dithering: Enable */
-#define LCD_PANEL_ID4_1280X1024 0x04
-/* Resolution: 1400x1050, Channel: dual, Dithering: Enable */
-#define LCD_PANEL_ID5_1400X1050 0x05
-/* Resolution: 1600x1200, Channel: dual, Dithering: Enable */
-#define LCD_PANEL_ID6_1600X1200 0x06
-/* Resolution: 1366x768, Channel: single, Dithering: Disable */
-#define LCD_PANEL_ID7_1366X768 0x07
-/* Resolution: 1024x600, Channel: single, Dithering: Enable*/
-#define LCD_PANEL_ID8_1024X600 0x08
-/* Resolution: 1280x800, Channel: single, Dithering: Enable*/
-#define LCD_PANEL_ID9_1280X800 0x09
-/* Resolution: 800x480, Channel: single, Dithering: Enable*/
-#define LCD_PANEL_IDA_800X480 0x0A
-/* Resolution: 1360x768, Channel: single, Dithering: Disable*/
-#define LCD_PANEL_IDB_1360X768 0x0B
-/* Resolution: 480x640, Channel: single, Dithering: Enable */
-#define LCD_PANEL_IDC_480X640 0x0C
-/* Resolution: 1200x900, Channel: single, Dithering: Disable */
-#define LCD_PANEL_IDD_1200X900 0x0D
-
-
-extern int viafb_LCD2_ON;
-extern int viafb_LCD_ON;
-extern int viafb_DVI_ON;
-
-void viafb_disable_lvds_vt1636(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-void viafb_enable_lvds_vt1636(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-void viafb_lcd_disable(void);
-void viafb_lcd_enable(void);
-void viafb_init_lcd_size(void);
-void viafb_init_lvds_output_interface(struct lvds_chip_information
- *plvds_chip_info,
- struct lvds_setting_information
- *plvds_setting_info);
-void viafb_lcd_set_mode(const struct fb_var_screeninfo *var, u16 cxres,
- u16 cyres, struct lvds_setting_information *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-bool viafb_lvds_trasmitter_identify(void);
-void viafb_init_lvds_output_interface(struct lvds_chip_information
- *plvds_chip_info,
- struct lvds_setting_information
- *plvds_setting_info);
-bool viafb_lcd_get_mobile_state(bool *mobile);
-
-#endif /* __LCD_H__ */
diff --git a/drivers/video/via/share.h b/drivers/video/via/share.h
deleted file mode 100644
index 65c65c611e0a..000000000000
--- a/drivers/video/via/share.h
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __SHARE_H__
-#define __SHARE_H__
-
-#include "via_modesetting.h"
-
-/* Define Bit Field */
-#define BIT0 0x01
-#define BIT1 0x02
-#define BIT2 0x04
-#define BIT3 0x08
-#define BIT4 0x10
-#define BIT5 0x20
-#define BIT6 0x40
-#define BIT7 0x80
-
-/* Video Memory Size */
-#define VIDEO_MEMORY_SIZE_16M 0x1000000
-
-/*
- * Lengths of the VPIT structure arrays.
- */
-#define StdCR 0x19
-#define StdSR 0x04
-#define StdGR 0x09
-#define StdAR 0x14
-
-#define PatchCR 11
-
-/* Display path */
-#define IGA1 1
-#define IGA2 2
-
-/* Define Color Depth */
-#define MODE_8BPP 1
-#define MODE_16BPP 2
-#define MODE_32BPP 4
-
-#define GR20 0x20
-#define GR21 0x21
-#define GR22 0x22
-
-/* Sequencer Registers */
-#define SR01 0x01
-#define SR10 0x10
-#define SR12 0x12
-#define SR15 0x15
-#define SR16 0x16
-#define SR17 0x17
-#define SR18 0x18
-#define SR1B 0x1B
-#define SR1A 0x1A
-#define SR1C 0x1C
-#define SR1D 0x1D
-#define SR1E 0x1E
-#define SR1F 0x1F
-#define SR20 0x20
-#define SR21 0x21
-#define SR22 0x22
-#define SR2A 0x2A
-#define SR2D 0x2D
-#define SR2E 0x2E
-
-#define SR30 0x30
-#define SR39 0x39
-#define SR3D 0x3D
-#define SR3E 0x3E
-#define SR3F 0x3F
-#define SR40 0x40
-#define SR43 0x43
-#define SR44 0x44
-#define SR45 0x45
-#define SR46 0x46
-#define SR47 0x47
-#define SR48 0x48
-#define SR49 0x49
-#define SR4A 0x4A
-#define SR4B 0x4B
-#define SR4C 0x4C
-#define SR52 0x52
-#define SR57 0x57
-#define SR58 0x58
-#define SR59 0x59
-#define SR5D 0x5D
-#define SR5E 0x5E
-#define SR65 0x65
-
-/* CRT Controller Registers */
-#define CR00 0x00
-#define CR01 0x01
-#define CR02 0x02
-#define CR03 0x03
-#define CR04 0x04
-#define CR05 0x05
-#define CR06 0x06
-#define CR07 0x07
-#define CR08 0x08
-#define CR09 0x09
-#define CR0A 0x0A
-#define CR0B 0x0B
-#define CR0C 0x0C
-#define CR0D 0x0D
-#define CR0E 0x0E
-#define CR0F 0x0F
-#define CR10 0x10
-#define CR11 0x11
-#define CR12 0x12
-#define CR13 0x13
-#define CR14 0x14
-#define CR15 0x15
-#define CR16 0x16
-#define CR17 0x17
-#define CR18 0x18
-
-/* Extend CRT Controller Registers */
-#define CR30 0x30
-#define CR31 0x31
-#define CR32 0x32
-#define CR33 0x33
-#define CR34 0x34
-#define CR35 0x35
-#define CR36 0x36
-#define CR37 0x37
-#define CR38 0x38
-#define CR39 0x39
-#define CR3A 0x3A
-#define CR3B 0x3B
-#define CR3C 0x3C
-#define CR3D 0x3D
-#define CR3E 0x3E
-#define CR3F 0x3F
-#define CR40 0x40
-#define CR41 0x41
-#define CR42 0x42
-#define CR43 0x43
-#define CR44 0x44
-#define CR45 0x45
-#define CR46 0x46
-#define CR47 0x47
-#define CR48 0x48
-#define CR49 0x49
-#define CR4A 0x4A
-#define CR4B 0x4B
-#define CR4C 0x4C
-#define CR4D 0x4D
-#define CR4E 0x4E
-#define CR4F 0x4F
-#define CR50 0x50
-#define CR51 0x51
-#define CR52 0x52
-#define CR53 0x53
-#define CR54 0x54
-#define CR55 0x55
-#define CR56 0x56
-#define CR57 0x57
-#define CR58 0x58
-#define CR59 0x59
-#define CR5A 0x5A
-#define CR5B 0x5B
-#define CR5C 0x5C
-#define CR5D 0x5D
-#define CR5E 0x5E
-#define CR5F 0x5F
-#define CR60 0x60
-#define CR61 0x61
-#define CR62 0x62
-#define CR63 0x63
-#define CR64 0x64
-#define CR65 0x65
-#define CR66 0x66
-#define CR67 0x67
-#define CR68 0x68
-#define CR69 0x69
-#define CR6A 0x6A
-#define CR6B 0x6B
-#define CR6C 0x6C
-#define CR6D 0x6D
-#define CR6E 0x6E
-#define CR6F 0x6F
-#define CR70 0x70
-#define CR71 0x71
-#define CR72 0x72
-#define CR73 0x73
-#define CR74 0x74
-#define CR75 0x75
-#define CR76 0x76
-#define CR77 0x77
-#define CR78 0x78
-#define CR79 0x79
-#define CR7A 0x7A
-#define CR7B 0x7B
-#define CR7C 0x7C
-#define CR7D 0x7D
-#define CR7E 0x7E
-#define CR7F 0x7F
-#define CR80 0x80
-#define CR81 0x81
-#define CR82 0x82
-#define CR83 0x83
-#define CR84 0x84
-#define CR85 0x85
-#define CR86 0x86
-#define CR87 0x87
-#define CR88 0x88
-#define CR89 0x89
-#define CR8A 0x8A
-#define CR8B 0x8B
-#define CR8C 0x8C
-#define CR8D 0x8D
-#define CR8E 0x8E
-#define CR8F 0x8F
-#define CR90 0x90
-#define CR91 0x91
-#define CR92 0x92
-#define CR93 0x93
-#define CR94 0x94
-#define CR95 0x95
-#define CR96 0x96
-#define CR97 0x97
-#define CR98 0x98
-#define CR99 0x99
-#define CR9A 0x9A
-#define CR9B 0x9B
-#define CR9C 0x9C
-#define CR9D 0x9D
-#define CR9E 0x9E
-#define CR9F 0x9F
-#define CRA0 0xA0
-#define CRA1 0xA1
-#define CRA2 0xA2
-#define CRA3 0xA3
-#define CRD2 0xD2
-#define CRD3 0xD3
-#define CRD4 0xD4
-
-/* LUT Table*/
-#define LUT_DATA 0x3C9 /* DACDATA */
-#define LUT_INDEX_READ 0x3C7 /* DACRX */
-#define LUT_INDEX_WRITE 0x3C8 /* DACWX */
-#define DACMASK 0x3C6
-
-/* Definition Device */
-#define DEVICE_CRT 0x01
-#define DEVICE_DVI 0x03
-#define DEVICE_LCD 0x04
-
-/* Device output interface */
-#define INTERFACE_NONE 0x00
-#define INTERFACE_ANALOG_RGB 0x01
-#define INTERFACE_DVP0 0x02
-#define INTERFACE_DVP1 0x03
-#define INTERFACE_DFP_HIGH 0x04
-#define INTERFACE_DFP_LOW 0x05
-#define INTERFACE_DFP 0x06
-#define INTERFACE_LVDS0 0x07
-#define INTERFACE_LVDS1 0x08
-#define INTERFACE_LVDS0LVDS1 0x09
-#define INTERFACE_TMDS 0x0A
-
-#define HW_LAYOUT_LCD_ONLY 0x01
-#define HW_LAYOUT_DVI_ONLY 0x02
-#define HW_LAYOUT_LCD_DVI 0x03
-#define HW_LAYOUT_LCD1_LCD2 0x04
-#define HW_LAYOUT_LCD_EXTERNAL_LCD2 0x10
-
-/* Definition CRTC Timing Index */
-#define H_TOTAL_INDEX 0
-#define H_ADDR_INDEX 1
-#define H_BLANK_START_INDEX 2
-#define H_BLANK_END_INDEX 3
-#define H_SYNC_START_INDEX 4
-#define H_SYNC_END_INDEX 5
-#define V_TOTAL_INDEX 6
-#define V_ADDR_INDEX 7
-#define V_BLANK_START_INDEX 8
-#define V_BLANK_END_INDEX 9
-#define V_SYNC_START_INDEX 10
-#define V_SYNC_END_INDEX 11
-#define H_TOTAL_SHADOW_INDEX 12
-#define H_BLANK_END_SHADOW_INDEX 13
-#define V_TOTAL_SHADOW_INDEX 14
-#define V_ADDR_SHADOW_INDEX 15
-#define V_BLANK_SATRT_SHADOW_INDEX 16
-#define V_BLANK_END_SHADOW_INDEX 17
-#define V_SYNC_SATRT_SHADOW_INDEX 18
-#define V_SYNC_END_SHADOW_INDEX 19
-
-/* LCD display method
-*/
-#define LCD_EXPANDSION 0x00
-#define LCD_CENTERING 0x01
-
-/* LCD mode
-*/
-#define LCD_OPENLDI 0x00
-#define LCD_SPWG 0x01
-
-struct crt_mode_table {
- int refresh_rate;
- int h_sync_polarity;
- int v_sync_polarity;
- struct via_display_timing crtc;
-};
-
-struct io_reg {
- int port;
- u8 index;
- u8 mask;
- u8 value;
-};
-
-#endif /* __SHARE_H__ */
diff --git a/drivers/video/via/tblDPASetting.c b/drivers/video/via/tblDPASetting.c
deleted file mode 100644
index 73bb554e7c1e..000000000000
--- a/drivers/video/via/tblDPASetting.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include "global.h"
-
-struct GFX_DPA_SETTING GFX_DPA_SETTING_TBL_VT3324[] = {
-/* ClkRange, DVP0, DVP0DataDriving, DVP0ClockDriving, DVP1,
- DVP1Driving, DFPHigh, DFPLow */
-/* CR96, SR2A[5], SR1B[1], SR2A[4], SR1E[2], CR9B,
- SR65, CR97, CR99 */
- /* LCK/VCK < 30000000 will use this value */
- {DPA_CLK_RANGE_30M, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00},
- /* 30000000 < LCK/VCK < 50000000 will use this value */
- {DPA_CLK_RANGE_30_50M, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00},
- /* 50000000 < LCK/VCK < 70000000 will use this value */
- {DPA_CLK_RANGE_50_70M, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
- 0x00},
- /* 70000000 < LCK/VCK < 100000000 will use this value */
- {DPA_CLK_RANGE_70_100M, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
- 0x00},
- /* 100000000 < LCK/VCK < 15000000 will use this value */
- {DPA_CLK_RANGE_100_150M, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
- 0x00},
- /* 15000000 < LCK/VCK will use this value */
- {DPA_CLK_RANGE_150M, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00,
- 0x00},
-};
-
-struct GFX_DPA_SETTING GFX_DPA_SETTING_TBL_VT3327[] = {
-/* ClkRange,DVP0, DVP0DataDriving, DVP0ClockDriving, DVP1,
- DVP1Driving, DFPHigh, DFPLow */
-/* CR96, SR2A[5], SR1B[1], SR2A[4], SR1E[2], CR9B,
- SR65, CR97, CR99 */
-/* LCK/VCK < 30000000 will use this value */
-{DPA_CLK_RANGE_30M, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x01},
-/* 30000000 < LCK/VCK < 50000000 will use this value */
-{DPA_CLK_RANGE_30_50M, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x01},
-/* 50000000 < LCK/VCK < 70000000 will use this value */
-{DPA_CLK_RANGE_50_70M, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x01},
-/* 70000000 < LCK/VCK < 100000000 will use this value */
-{DPA_CLK_RANGE_70_100M, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x03},
-/* 100000000 < LCK/VCK < 15000000 will use this value */
-{DPA_CLK_RANGE_100_150M, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x02},
-/* 15000000 < LCK/VCK will use this value */
-{DPA_CLK_RANGE_150M, 0x00, 0x20, 0x00, 0x10, 0x00, 0x03, 0x00, 0x0D, 0x03},
-};
-
-/* For VT3364: */
-struct GFX_DPA_SETTING GFX_DPA_SETTING_TBL_VT3364[] = {
-/* ClkRange,DVP0, DVP0DataDriving, DVP0ClockDriving, DVP1,
- DVP1Driving, DFPHigh, DFPLow */
-/* CR96, SR2A[5], SR1B[1], SR2A[4], SR1E[2], CR9B,
- SR65, CR97, CR99 */
-/* LCK/VCK < 30000000 will use this value */
-{DPA_CLK_RANGE_30M, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08},
-/* 30000000 < LCK/VCK < 50000000 will use this value */
-{DPA_CLK_RANGE_30_50M, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08},
-/* 50000000 < LCK/VCK < 70000000 will use this value */
-{DPA_CLK_RANGE_50_70M, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08},
-/* 70000000 < LCK/VCK < 100000000 will use this value */
-{DPA_CLK_RANGE_70_100M, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08},
-/* 100000000 < LCK/VCK < 15000000 will use this value */
-{DPA_CLK_RANGE_100_150M, 0x03, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08},
-/* 15000000 < LCK/VCK will use this value */
-{DPA_CLK_RANGE_150M, 0x01, 0x00, 0x02, 0x10, 0x00, 0x03, 0x00, 0x00, 0x08},
-};
diff --git a/drivers/video/via/tblDPASetting.h b/drivers/video/via/tblDPASetting.h
deleted file mode 100644
index 6db61519cb5d..000000000000
--- a/drivers/video/via/tblDPASetting.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef _TBLDPASETTING_H_
-#define _TBLDPASETTING_H_
-#include "global.h"
-
-#define DPA_CLK_30M 30000000
-#define DPA_CLK_50M 50000000
-#define DPA_CLK_70M 70000000
-#define DPA_CLK_100M 100000000
-#define DPA_CLK_150M 150000000
-
-enum DPA_RANGE {
- DPA_CLK_RANGE_30M,
- DPA_CLK_RANGE_30_50M,
- DPA_CLK_RANGE_50_70M,
- DPA_CLK_RANGE_70_100M,
- DPA_CLK_RANGE_100_150M,
- DPA_CLK_RANGE_150M
-};
-
-extern struct GFX_DPA_SETTING GFX_DPA_SETTING_TBL_VT3324[6];
-extern struct GFX_DPA_SETTING GFX_DPA_SETTING_TBL_VT3327[];
-extern struct GFX_DPA_SETTING GFX_DPA_SETTING_TBL_VT3364[6];
-
-#endif
diff --git a/drivers/video/via/via-core.c b/drivers/video/via/via-core.c
deleted file mode 100644
index 6e274825fb31..000000000000
--- a/drivers/video/via/via-core.c
+++ /dev/null
@@ -1,790 +0,0 @@
-/*
- * Copyright 1998-2009 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
- * Copyright 2009 Jonathan Corbet <corbet@lwn.net>
- */
-
-/*
- * Core code for the Via multifunction framebuffer device.
- */
-#include <linux/via-core.h>
-#include <linux/via_i2c.h>
-#include <linux/via-gpio.h>
-#include "global.h"
-
-#include <linux/module.h>
-#include <linux/interrupt.h>
-#include <linux/platform_device.h>
-#include <linux/list.h>
-#include <linux/pm.h>
-#include <asm/olpc.h>
-
-/*
- * The default port config.
- */
-static struct via_port_cfg adap_configs[] = {
- [VIA_PORT_26] = { VIA_PORT_I2C, VIA_MODE_I2C, VIASR, 0x26 },
- [VIA_PORT_31] = { VIA_PORT_I2C, VIA_MODE_I2C, VIASR, 0x31 },
- [VIA_PORT_25] = { VIA_PORT_GPIO, VIA_MODE_GPIO, VIASR, 0x25 },
- [VIA_PORT_2C] = { VIA_PORT_GPIO, VIA_MODE_I2C, VIASR, 0x2c },
- [VIA_PORT_3D] = { VIA_PORT_GPIO, VIA_MODE_GPIO, VIASR, 0x3d },
- { 0, 0, 0, 0 }
-};
-
-/*
- * The OLPC XO-1.5 puts the camera power and reset lines onto
- * GPIO 2C.
- */
-static struct via_port_cfg olpc_adap_configs[] = {
- [VIA_PORT_26] = { VIA_PORT_I2C, VIA_MODE_I2C, VIASR, 0x26 },
- [VIA_PORT_31] = { VIA_PORT_I2C, VIA_MODE_I2C, VIASR, 0x31 },
- [VIA_PORT_25] = { VIA_PORT_GPIO, VIA_MODE_GPIO, VIASR, 0x25 },
- [VIA_PORT_2C] = { VIA_PORT_GPIO, VIA_MODE_GPIO, VIASR, 0x2c },
- [VIA_PORT_3D] = { VIA_PORT_GPIO, VIA_MODE_GPIO, VIASR, 0x3d },
- { 0, 0, 0, 0 }
-};
-
-/*
- * We currently only support one viafb device (will there ever be
- * more than one?), so just declare it globally here.
- */
-static struct viafb_dev global_dev;
-
-
-/*
- * Basic register access; spinlock required.
- */
-static inline void viafb_mmio_write(int reg, u32 v)
-{
- iowrite32(v, global_dev.engine_mmio + reg);
-}
-
-static inline int viafb_mmio_read(int reg)
-{
- return ioread32(global_dev.engine_mmio + reg);
-}
-
-/* ---------------------------------------------------------------------- */
-/*
- * Interrupt management. We have a single IRQ line for a lot of
- * different functions, so we need to share it. The design here
- * is that we don't want to reimplement the shared IRQ code here;
- * we also want to avoid having contention for a single handler thread.
- * So each subdev driver which needs interrupts just requests
- * them directly from the kernel. We just have what's needed for
- * overall access to the interrupt control register.
- */
-
-/*
- * Which interrupts are enabled now?
- */
-static u32 viafb_enabled_ints;
-
-static void viafb_int_init(void)
-{
- viafb_enabled_ints = 0;
-
- viafb_mmio_write(VDE_INTERRUPT, 0);
-}
-
-/*
- * Allow subdevs to ask for specific interrupts to be enabled. These
- * functions must be called with reg_lock held
- */
-void viafb_irq_enable(u32 mask)
-{
- viafb_enabled_ints |= mask;
- viafb_mmio_write(VDE_INTERRUPT, viafb_enabled_ints | VDE_I_ENABLE);
-}
-EXPORT_SYMBOL_GPL(viafb_irq_enable);
-
-void viafb_irq_disable(u32 mask)
-{
- viafb_enabled_ints &= ~mask;
- if (viafb_enabled_ints == 0)
- viafb_mmio_write(VDE_INTERRUPT, 0); /* Disable entirely */
- else
- viafb_mmio_write(VDE_INTERRUPT,
- viafb_enabled_ints | VDE_I_ENABLE);
-}
-EXPORT_SYMBOL_GPL(viafb_irq_disable);
-
-/* ---------------------------------------------------------------------- */
-/*
- * Currently, the camera driver is the only user of the DMA code, so we
- * only compile it in if the camera driver is being built. Chances are,
- * most viafb systems will not need to have this extra code for a while.
- * As soon as another user comes long, the ifdef can be removed.
- */
-#if defined(CONFIG_VIDEO_VIA_CAMERA) || defined(CONFIG_VIDEO_VIA_CAMERA_MODULE)
-/*
- * Access to the DMA engine. This currently provides what the camera
- * driver needs (i.e. outgoing only) but is easily expandable if need
- * be.
- */
-
-/*
- * There are four DMA channels in the vx855. For now, we only
- * use one of them, though. Most of the time, the DMA channel
- * will be idle, so we keep the IRQ handler unregistered except
- * when some subsystem has indicated an interest.
- */
-static int viafb_dma_users;
-static DECLARE_COMPLETION(viafb_dma_completion);
-/*
- * This mutex protects viafb_dma_users and our global interrupt
- * registration state; it also serializes access to the DMA
- * engine.
- */
-static DEFINE_MUTEX(viafb_dma_lock);
-
-/*
- * The VX855 DMA descriptor (used for s/g transfers) looks
- * like this.
- */
-struct viafb_vx855_dma_descr {
- u32 addr_low; /* Low part of phys addr */
- u32 addr_high; /* High 12 bits of addr */
- u32 fb_offset; /* Offset into FB memory */
- u32 seg_size; /* Size, 16-byte units */
- u32 tile_mode; /* "tile mode" setting */
- u32 next_desc_low; /* Next descriptor addr */
- u32 next_desc_high;
- u32 pad; /* Fill out to 64 bytes */
-};
-
-/*
- * Flags added to the "next descriptor low" pointers
- */
-#define VIAFB_DMA_MAGIC 0x01 /* ??? Just has to be there */
-#define VIAFB_DMA_FINAL_SEGMENT 0x02 /* Final segment */
-
-/*
- * The completion IRQ handler.
- */
-static irqreturn_t viafb_dma_irq(int irq, void *data)
-{
- int csr;
- irqreturn_t ret = IRQ_NONE;
-
- spin_lock(&global_dev.reg_lock);
- csr = viafb_mmio_read(VDMA_CSR0);
- if (csr & VDMA_C_DONE) {
- viafb_mmio_write(VDMA_CSR0, VDMA_C_DONE);
- complete(&viafb_dma_completion);
- ret = IRQ_HANDLED;
- }
- spin_unlock(&global_dev.reg_lock);
- return ret;
-}
-
-/*
- * Indicate a need for DMA functionality.
- */
-int viafb_request_dma(void)
-{
- int ret = 0;
-
- /*
- * Only VX855 is supported currently.
- */
- if (global_dev.chip_type != UNICHROME_VX855)
- return -ENODEV;
- /*
- * Note the new user and set up our interrupt handler
- * if need be.
- */
- mutex_lock(&viafb_dma_lock);
- viafb_dma_users++;
- if (viafb_dma_users == 1) {
- ret = request_irq(global_dev.pdev->irq, viafb_dma_irq,
- IRQF_SHARED, "via-dma", &viafb_dma_users);
- if (ret)
- viafb_dma_users--;
- else
- viafb_irq_enable(VDE_I_DMA0TDEN);
- }
- mutex_unlock(&viafb_dma_lock);
- return ret;
-}
-EXPORT_SYMBOL_GPL(viafb_request_dma);
-
-void viafb_release_dma(void)
-{
- mutex_lock(&viafb_dma_lock);
- viafb_dma_users--;
- if (viafb_dma_users == 0) {
- viafb_irq_disable(VDE_I_DMA0TDEN);
- free_irq(global_dev.pdev->irq, &viafb_dma_users);
- }
- mutex_unlock(&viafb_dma_lock);
-}
-EXPORT_SYMBOL_GPL(viafb_release_dma);
-
-
-#if 0
-/*
- * Copy a single buffer from FB memory, synchronously. This code works
- * but is not currently used.
- */
-void viafb_dma_copy_out(unsigned int offset, dma_addr_t paddr, int len)
-{
- unsigned long flags;
- int csr;
-
- mutex_lock(&viafb_dma_lock);
- init_completion(&viafb_dma_completion);
- /*
- * Program the controller.
- */
- spin_lock_irqsave(&global_dev.reg_lock, flags);
- viafb_mmio_write(VDMA_CSR0, VDMA_C_ENABLE|VDMA_C_DONE);
- /* Enable ints; must happen after CSR0 write! */
- viafb_mmio_write(VDMA_MR0, VDMA_MR_TDIE);
- viafb_mmio_write(VDMA_MARL0, (int) (paddr & 0xfffffff0));
- viafb_mmio_write(VDMA_MARH0, (int) ((paddr >> 28) & 0xfff));
- /* Data sheet suggests DAR0 should be <<4, but it lies */
- viafb_mmio_write(VDMA_DAR0, offset);
- viafb_mmio_write(VDMA_DQWCR0, len >> 4);
- viafb_mmio_write(VDMA_TMR0, 0);
- viafb_mmio_write(VDMA_DPRL0, 0);
- viafb_mmio_write(VDMA_DPRH0, 0);
- viafb_mmio_write(VDMA_PMR0, 0);
- csr = viafb_mmio_read(VDMA_CSR0);
- viafb_mmio_write(VDMA_CSR0, VDMA_C_ENABLE|VDMA_C_START);
- spin_unlock_irqrestore(&global_dev.reg_lock, flags);
- /*
- * Now we just wait until the interrupt handler says
- * we're done.
- */
- wait_for_completion_interruptible(&viafb_dma_completion);
- viafb_mmio_write(VDMA_MR0, 0); /* Reset int enable */
- mutex_unlock(&viafb_dma_lock);
-}
-EXPORT_SYMBOL_GPL(viafb_dma_copy_out);
-#endif
-
-/*
- * Do a scatter/gather DMA copy from FB memory. You must have done
- * a successful call to viafb_request_dma() first.
- */
-int viafb_dma_copy_out_sg(unsigned int offset, struct scatterlist *sg, int nsg)
-{
- struct viafb_vx855_dma_descr *descr;
- void *descrpages;
- dma_addr_t descr_handle;
- unsigned long flags;
- int i;
- struct scatterlist *sgentry;
- dma_addr_t nextdesc;
-
- /*
- * Get a place to put the descriptors.
- */
- descrpages = dma_alloc_coherent(&global_dev.pdev->dev,
- nsg*sizeof(struct viafb_vx855_dma_descr),
- &descr_handle, GFP_KERNEL);
- if (descrpages == NULL) {
- dev_err(&global_dev.pdev->dev, "Unable to get descr page.\n");
- return -ENOMEM;
- }
- mutex_lock(&viafb_dma_lock);
- /*
- * Fill them in.
- */
- descr = descrpages;
- nextdesc = descr_handle + sizeof(struct viafb_vx855_dma_descr);
- for_each_sg(sg, sgentry, nsg, i) {
- dma_addr_t paddr = sg_dma_address(sgentry);
- descr->addr_low = paddr & 0xfffffff0;
- descr->addr_high = ((u64) paddr >> 32) & 0x0fff;
- descr->fb_offset = offset;
- descr->seg_size = sg_dma_len(sgentry) >> 4;
- descr->tile_mode = 0;
- descr->next_desc_low = (nextdesc&0xfffffff0) | VIAFB_DMA_MAGIC;
- descr->next_desc_high = ((u64) nextdesc >> 32) & 0x0fff;
- descr->pad = 0xffffffff; /* VIA driver does this */
- offset += sg_dma_len(sgentry);
- nextdesc += sizeof(struct viafb_vx855_dma_descr);
- descr++;
- }
- descr[-1].next_desc_low = VIAFB_DMA_FINAL_SEGMENT|VIAFB_DMA_MAGIC;
- /*
- * Program the engine.
- */
- spin_lock_irqsave(&global_dev.reg_lock, flags);
- init_completion(&viafb_dma_completion);
- viafb_mmio_write(VDMA_DQWCR0, 0);
- viafb_mmio_write(VDMA_CSR0, VDMA_C_ENABLE|VDMA_C_DONE);
- viafb_mmio_write(VDMA_MR0, VDMA_MR_TDIE | VDMA_MR_CHAIN);
- viafb_mmio_write(VDMA_DPRL0, descr_handle | VIAFB_DMA_MAGIC);
- viafb_mmio_write(VDMA_DPRH0,
- (((u64)descr_handle >> 32) & 0x0fff) | 0xf0000);
- (void) viafb_mmio_read(VDMA_CSR0);
- viafb_mmio_write(VDMA_CSR0, VDMA_C_ENABLE|VDMA_C_START);
- spin_unlock_irqrestore(&global_dev.reg_lock, flags);
- /*
- * Now we just wait until the interrupt handler says
- * we're done. Except that, actually, we need to wait a little
- * longer: the interrupts seem to jump the gun a little and we
- * get corrupted frames sometimes.
- */
- wait_for_completion_timeout(&viafb_dma_completion, 1);
- msleep(1);
- if ((viafb_mmio_read(VDMA_CSR0)&VDMA_C_DONE) == 0)
- printk(KERN_ERR "VIA DMA timeout!\n");
- /*
- * Clean up and we're done.
- */
- viafb_mmio_write(VDMA_CSR0, VDMA_C_DONE);
- viafb_mmio_write(VDMA_MR0, 0); /* Reset int enable */
- mutex_unlock(&viafb_dma_lock);
- dma_free_coherent(&global_dev.pdev->dev,
- nsg*sizeof(struct viafb_vx855_dma_descr), descrpages,
- descr_handle);
- return 0;
-}
-EXPORT_SYMBOL_GPL(viafb_dma_copy_out_sg);
-#endif /* CONFIG_VIDEO_VIA_CAMERA */
-
-/* ---------------------------------------------------------------------- */
-/*
- * Figure out how big our framebuffer memory is. Kind of ugly,
- * but evidently we can't trust the information found in the
- * fbdev configuration area.
- */
-static u16 via_function3[] = {
- CLE266_FUNCTION3, KM400_FUNCTION3, CN400_FUNCTION3, CN700_FUNCTION3,
- CX700_FUNCTION3, KM800_FUNCTION3, KM890_FUNCTION3, P4M890_FUNCTION3,
- P4M900_FUNCTION3, VX800_FUNCTION3, VX855_FUNCTION3, VX900_FUNCTION3,
-};
-
-/* Get the BIOS-configured framebuffer size from PCI configuration space
- * of function 3 in the respective chipset */
-static int viafb_get_fb_size_from_pci(int chip_type)
-{
- int i;
- u8 offset = 0;
- u32 FBSize;
- u32 VideoMemSize;
-
- /* search for the "FUNCTION3" device in this chipset */
- for (i = 0; i < ARRAY_SIZE(via_function3); i++) {
- struct pci_dev *pdev;
-
- pdev = pci_get_device(PCI_VENDOR_ID_VIA, via_function3[i],
- NULL);
- if (!pdev)
- continue;
-
- DEBUG_MSG(KERN_INFO "Device ID = %x\n", pdev->device);
-
- switch (pdev->device) {
- case CLE266_FUNCTION3:
- case KM400_FUNCTION3:
- offset = 0xE0;
- break;
- case CN400_FUNCTION3:
- case CN700_FUNCTION3:
- case CX700_FUNCTION3:
- case KM800_FUNCTION3:
- case KM890_FUNCTION3:
- case P4M890_FUNCTION3:
- case P4M900_FUNCTION3:
- case VX800_FUNCTION3:
- case VX855_FUNCTION3:
- case VX900_FUNCTION3:
- /*case CN750_FUNCTION3: */
- offset = 0xA0;
- break;
- }
-
- if (!offset)
- break;
-
- pci_read_config_dword(pdev, offset, &FBSize);
- pci_dev_put(pdev);
- }
-
- if (!offset) {
- printk(KERN_ERR "cannot determine framebuffer size\n");
- return -EIO;
- }
-
- FBSize = FBSize & 0x00007000;
- DEBUG_MSG(KERN_INFO "FB Size = %x\n", FBSize);
-
- if (chip_type < UNICHROME_CX700) {
- switch (FBSize) {
- case 0x00004000:
- VideoMemSize = (16 << 20); /*16M */
- break;
-
- case 0x00005000:
- VideoMemSize = (32 << 20); /*32M */
- break;
-
- case 0x00006000:
- VideoMemSize = (64 << 20); /*64M */
- break;
-
- default:
- VideoMemSize = (32 << 20); /*32M */
- break;
- }
- } else {
- switch (FBSize) {
- case 0x00001000:
- VideoMemSize = (8 << 20); /*8M */
- break;
-
- case 0x00002000:
- VideoMemSize = (16 << 20); /*16M */
- break;
-
- case 0x00003000:
- VideoMemSize = (32 << 20); /*32M */
- break;
-
- case 0x00004000:
- VideoMemSize = (64 << 20); /*64M */
- break;
-
- case 0x00005000:
- VideoMemSize = (128 << 20); /*128M */
- break;
-
- case 0x00006000:
- VideoMemSize = (256 << 20); /*256M */
- break;
-
- case 0x00007000: /* Only on VX855/875 */
- VideoMemSize = (512 << 20); /*512M */
- break;
-
- default:
- VideoMemSize = (32 << 20); /*32M */
- break;
- }
- }
-
- return VideoMemSize;
-}
-
-
-/*
- * Figure out and map our MMIO regions.
- */
-static int via_pci_setup_mmio(struct viafb_dev *vdev)
-{
- int ret;
- /*
- * Hook up to the device registers. Note that we soldier
- * on if it fails; the framebuffer can operate (without
- * acceleration) without this region.
- */
- vdev->engine_start = pci_resource_start(vdev->pdev, 1);
- vdev->engine_len = pci_resource_len(vdev->pdev, 1);
- vdev->engine_mmio = ioremap_nocache(vdev->engine_start,
- vdev->engine_len);
- if (vdev->engine_mmio == NULL)
- dev_err(&vdev->pdev->dev,
- "Unable to map engine MMIO; operation will be "
- "slow and crippled.\n");
- /*
- * Map in framebuffer memory. For now, failure here is
- * fatal. Unfortunately, in the absence of significant
- * vmalloc space, failure here is also entirely plausible.
- * Eventually we want to move away from mapping this
- * entire region.
- */
- if (vdev->chip_type == UNICHROME_VX900)
- vdev->fbmem_start = pci_resource_start(vdev->pdev, 2);
- else
- vdev->fbmem_start = pci_resource_start(vdev->pdev, 0);
- ret = vdev->fbmem_len = viafb_get_fb_size_from_pci(vdev->chip_type);
- if (ret < 0)
- goto out_unmap;
-
- /* try to map less memory on failure, 8 MB should be still enough */
- for (; vdev->fbmem_len >= 8 << 20; vdev->fbmem_len /= 2) {
- vdev->fbmem = ioremap_wc(vdev->fbmem_start, vdev->fbmem_len);
- if (vdev->fbmem)
- break;
- }
-
- if (vdev->fbmem == NULL) {
- ret = -ENOMEM;
- goto out_unmap;
- }
- return 0;
-out_unmap:
- iounmap(vdev->engine_mmio);
- return ret;
-}
-
-static void via_pci_teardown_mmio(struct viafb_dev *vdev)
-{
- iounmap(vdev->fbmem);
- iounmap(vdev->engine_mmio);
-}
-
-/*
- * Create our subsidiary devices.
- */
-static struct viafb_subdev_info {
- char *name;
- struct platform_device *platdev;
-} viafb_subdevs[] = {
- {
- .name = "viafb-gpio",
- },
- {
- .name = "viafb-i2c",
- },
-#if defined(CONFIG_VIDEO_VIA_CAMERA) || defined(CONFIG_VIDEO_VIA_CAMERA_MODULE)
- {
- .name = "viafb-camera",
- },
-#endif
-};
-#define N_SUBDEVS ARRAY_SIZE(viafb_subdevs)
-
-static int via_create_subdev(struct viafb_dev *vdev,
- struct viafb_subdev_info *info)
-{
- int ret;
-
- info->platdev = platform_device_alloc(info->name, -1);
- if (!info->platdev) {
- dev_err(&vdev->pdev->dev, "Unable to allocate pdev %s\n",
- info->name);
- return -ENOMEM;
- }
- info->platdev->dev.parent = &vdev->pdev->dev;
- info->platdev->dev.platform_data = vdev;
- ret = platform_device_add(info->platdev);
- if (ret) {
- dev_err(&vdev->pdev->dev, "Unable to add pdev %s\n",
- info->name);
- platform_device_put(info->platdev);
- info->platdev = NULL;
- }
- return ret;
-}
-
-static int via_setup_subdevs(struct viafb_dev *vdev)
-{
- int i;
-
- /*
- * Ignore return values. Even if some of the devices
- * fail to be created, we'll still be able to use some
- * of the rest.
- */
- for (i = 0; i < N_SUBDEVS; i++)
- via_create_subdev(vdev, viafb_subdevs + i);
- return 0;
-}
-
-static void via_teardown_subdevs(void)
-{
- int i;
-
- for (i = 0; i < N_SUBDEVS; i++)
- if (viafb_subdevs[i].platdev) {
- viafb_subdevs[i].platdev->dev.platform_data = NULL;
- platform_device_unregister(viafb_subdevs[i].platdev);
- }
-}
-
-/*
- * Power management functions
- */
-#ifdef CONFIG_PM
-static LIST_HEAD(viafb_pm_hooks);
-static DEFINE_MUTEX(viafb_pm_hooks_lock);
-
-void viafb_pm_register(struct viafb_pm_hooks *hooks)
-{
- INIT_LIST_HEAD(&hooks->list);
-
- mutex_lock(&viafb_pm_hooks_lock);
- list_add_tail(&hooks->list, &viafb_pm_hooks);
- mutex_unlock(&viafb_pm_hooks_lock);
-}
-EXPORT_SYMBOL_GPL(viafb_pm_register);
-
-void viafb_pm_unregister(struct viafb_pm_hooks *hooks)
-{
- mutex_lock(&viafb_pm_hooks_lock);
- list_del(&hooks->list);
- mutex_unlock(&viafb_pm_hooks_lock);
-}
-EXPORT_SYMBOL_GPL(viafb_pm_unregister);
-
-static int via_suspend(struct pci_dev *pdev, pm_message_t state)
-{
- struct viafb_pm_hooks *hooks;
-
- if (state.event != PM_EVENT_SUSPEND)
- return 0;
- /*
- * "I've occasionally hit a few drivers that caused suspend
- * failures, and each and every time it was a driver bug, and
- * the right thing to do was to just ignore the error and suspend
- * anyway - returning an error code and trying to undo the suspend
- * is not what anybody ever really wants, even if our model
- *_allows_ for it."
- * -- Linus Torvalds, Dec. 7, 2009
- */
- mutex_lock(&viafb_pm_hooks_lock);
- list_for_each_entry_reverse(hooks, &viafb_pm_hooks, list)
- hooks->suspend(hooks->private);
- mutex_unlock(&viafb_pm_hooks_lock);
-
- pci_save_state(pdev);
- pci_disable_device(pdev);
- pci_set_power_state(pdev, pci_choose_state(pdev, state));
- return 0;
-}
-
-static int via_resume(struct pci_dev *pdev)
-{
- struct viafb_pm_hooks *hooks;
-
- /* Get the bus side powered up */
- pci_set_power_state(pdev, PCI_D0);
- pci_restore_state(pdev);
- if (pci_enable_device(pdev))
- return 0;
-
- pci_set_master(pdev);
-
- /* Now bring back any subdevs */
- mutex_lock(&viafb_pm_hooks_lock);
- list_for_each_entry(hooks, &viafb_pm_hooks, list)
- hooks->resume(hooks->private);
- mutex_unlock(&viafb_pm_hooks_lock);
-
- return 0;
-}
-#endif /* CONFIG_PM */
-
-static int via_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
-{
- int ret;
-
- ret = pci_enable_device(pdev);
- if (ret)
- return ret;
-
- /*
- * Global device initialization.
- */
- memset(&global_dev, 0, sizeof(global_dev));
- global_dev.pdev = pdev;
- global_dev.chip_type = ent->driver_data;
- global_dev.port_cfg = adap_configs;
- if (machine_is_olpc())
- global_dev.port_cfg = olpc_adap_configs;
-
- spin_lock_init(&global_dev.reg_lock);
- ret = via_pci_setup_mmio(&global_dev);
- if (ret)
- goto out_disable;
- /*
- * Set up interrupts and create our subdevices. Continue even if
- * some things fail.
- */
- viafb_int_init();
- via_setup_subdevs(&global_dev);
- /*
- * Set up the framebuffer device
- */
- ret = via_fb_pci_probe(&global_dev);
- if (ret)
- goto out_subdevs;
- return 0;
-
-out_subdevs:
- via_teardown_subdevs();
- via_pci_teardown_mmio(&global_dev);
-out_disable:
- pci_disable_device(pdev);
- return ret;
-}
-
-static void via_pci_remove(struct pci_dev *pdev)
-{
- via_teardown_subdevs();
- via_fb_pci_remove(pdev);
- via_pci_teardown_mmio(&global_dev);
- pci_disable_device(pdev);
-}
-
-
-static struct pci_device_id via_pci_table[] = {
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_CLE266_DID),
- .driver_data = UNICHROME_CLE266 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_K400_DID),
- .driver_data = UNICHROME_K400 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_K800_DID),
- .driver_data = UNICHROME_K800 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_PM800_DID),
- .driver_data = UNICHROME_PM800 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_CN700_DID),
- .driver_data = UNICHROME_CN700 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_CX700_DID),
- .driver_data = UNICHROME_CX700 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_CN750_DID),
- .driver_data = UNICHROME_CN750 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_K8M890_DID),
- .driver_data = UNICHROME_K8M890 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_P4M890_DID),
- .driver_data = UNICHROME_P4M890 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_P4M900_DID),
- .driver_data = UNICHROME_P4M900 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_VX800_DID),
- .driver_data = UNICHROME_VX800 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_VX855_DID),
- .driver_data = UNICHROME_VX855 },
- { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_VX900_DID),
- .driver_data = UNICHROME_VX900 },
- { }
-};
-MODULE_DEVICE_TABLE(pci, via_pci_table);
-
-static struct pci_driver via_driver = {
- .name = "viafb",
- .id_table = via_pci_table,
- .probe = via_pci_probe,
- .remove = via_pci_remove,
-#ifdef CONFIG_PM
- .suspend = via_suspend,
- .resume = via_resume,
-#endif
-};
-
-static int __init via_core_init(void)
-{
- int ret;
-
- ret = viafb_init();
- if (ret)
- return ret;
- viafb_i2c_init();
- viafb_gpio_init();
- return pci_register_driver(&via_driver);
-}
-
-static void __exit via_core_exit(void)
-{
- pci_unregister_driver(&via_driver);
- viafb_gpio_exit();
- viafb_i2c_exit();
- viafb_exit();
-}
-
-module_init(via_core_init);
-module_exit(via_core_exit);
diff --git a/drivers/video/via/via-gpio.c b/drivers/video/via/via-gpio.c
deleted file mode 100644
index e408679081ab..000000000000
--- a/drivers/video/via/via-gpio.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Support for viafb GPIO ports.
- *
- * Copyright 2009 Jonathan Corbet <corbet@lwn.net>
- * Distributable under version 2 of the GNU General Public License.
- */
-
-#include <linux/spinlock.h>
-#include <linux/gpio.h>
-#include <linux/platform_device.h>
-#include <linux/via-core.h>
-#include <linux/via-gpio.h>
-#include <linux/export.h>
-
-/*
- * The ports we know about. Note that the port-25 gpios are not
- * mentioned in the datasheet.
- */
-
-struct viafb_gpio {
- char *vg_name; /* Data sheet name */
- u16 vg_io_port;
- u8 vg_port_index;
- int vg_mask_shift;
-};
-
-static struct viafb_gpio viafb_all_gpios[] = {
- {
- .vg_name = "VGPIO0", /* Guess - not in datasheet */
- .vg_io_port = VIASR,
- .vg_port_index = 0x25,
- .vg_mask_shift = 1
- },
- {
- .vg_name = "VGPIO1",
- .vg_io_port = VIASR,
- .vg_port_index = 0x25,
- .vg_mask_shift = 0
- },
- {
- .vg_name = "VGPIO2", /* aka DISPCLKI0 */
- .vg_io_port = VIASR,
- .vg_port_index = 0x2c,
- .vg_mask_shift = 1
- },
- {
- .vg_name = "VGPIO3", /* aka DISPCLKO0 */
- .vg_io_port = VIASR,
- .vg_port_index = 0x2c,
- .vg_mask_shift = 0
- },
- {
- .vg_name = "VGPIO4", /* DISPCLKI1 */
- .vg_io_port = VIASR,
- .vg_port_index = 0x3d,
- .vg_mask_shift = 1
- },
- {
- .vg_name = "VGPIO5", /* DISPCLKO1 */
- .vg_io_port = VIASR,
- .vg_port_index = 0x3d,
- .vg_mask_shift = 0
- },
-};
-
-#define VIAFB_NUM_GPIOS ARRAY_SIZE(viafb_all_gpios)
-
-/*
- * This structure controls the active GPIOs, which may be a subset
- * of those which are known.
- */
-
-struct viafb_gpio_cfg {
- struct gpio_chip gpio_chip;
- struct viafb_dev *vdev;
- struct viafb_gpio *active_gpios[VIAFB_NUM_GPIOS];
- const char *gpio_names[VIAFB_NUM_GPIOS];
-};
-
-/*
- * GPIO access functions
- */
-static void via_gpio_set(struct gpio_chip *chip, unsigned int nr,
- int value)
-{
- struct viafb_gpio_cfg *cfg = container_of(chip,
- struct viafb_gpio_cfg,
- gpio_chip);
- u8 reg;
- struct viafb_gpio *gpio;
- unsigned long flags;
-
- spin_lock_irqsave(&cfg->vdev->reg_lock, flags);
- gpio = cfg->active_gpios[nr];
- reg = via_read_reg(VIASR, gpio->vg_port_index);
- reg |= 0x40 << gpio->vg_mask_shift; /* output enable */
- if (value)
- reg |= 0x10 << gpio->vg_mask_shift;
- else
- reg &= ~(0x10 << gpio->vg_mask_shift);
- via_write_reg(VIASR, gpio->vg_port_index, reg);
- spin_unlock_irqrestore(&cfg->vdev->reg_lock, flags);
-}
-
-static int via_gpio_dir_out(struct gpio_chip *chip, unsigned int nr,
- int value)
-{
- via_gpio_set(chip, nr, value);
- return 0;
-}
-
-/*
- * Set the input direction. I'm not sure this is right; we should
- * be able to do input without disabling output.
- */
-static int via_gpio_dir_input(struct gpio_chip *chip, unsigned int nr)
-{
- struct viafb_gpio_cfg *cfg = container_of(chip,
- struct viafb_gpio_cfg,
- gpio_chip);
- struct viafb_gpio *gpio;
- unsigned long flags;
-
- spin_lock_irqsave(&cfg->vdev->reg_lock, flags);
- gpio = cfg->active_gpios[nr];
- via_write_reg_mask(VIASR, gpio->vg_port_index, 0,
- 0x40 << gpio->vg_mask_shift);
- spin_unlock_irqrestore(&cfg->vdev->reg_lock, flags);
- return 0;
-}
-
-static int via_gpio_get(struct gpio_chip *chip, unsigned int nr)
-{
- struct viafb_gpio_cfg *cfg = container_of(chip,
- struct viafb_gpio_cfg,
- gpio_chip);
- u8 reg;
- struct viafb_gpio *gpio;
- unsigned long flags;
-
- spin_lock_irqsave(&cfg->vdev->reg_lock, flags);
- gpio = cfg->active_gpios[nr];
- reg = via_read_reg(VIASR, gpio->vg_port_index);
- spin_unlock_irqrestore(&cfg->vdev->reg_lock, flags);
- return reg & (0x04 << gpio->vg_mask_shift);
-}
-
-
-static struct viafb_gpio_cfg viafb_gpio_config = {
- .gpio_chip = {
- .label = "VIAFB onboard GPIO",
- .owner = THIS_MODULE,
- .direction_output = via_gpio_dir_out,
- .set = via_gpio_set,
- .direction_input = via_gpio_dir_input,
- .get = via_gpio_get,
- .base = -1,
- .ngpio = 0,
- .can_sleep = 0
- }
-};
-
-/*
- * Manage the software enable bit.
- */
-static void viafb_gpio_enable(struct viafb_gpio *gpio)
-{
- via_write_reg_mask(VIASR, gpio->vg_port_index, 0x02, 0x02);
-}
-
-static void viafb_gpio_disable(struct viafb_gpio *gpio)
-{
- via_write_reg_mask(VIASR, gpio->vg_port_index, 0, 0x02);
-}
-
-#ifdef CONFIG_PM
-
-static int viafb_gpio_suspend(void *private)
-{
- return 0;
-}
-
-static int viafb_gpio_resume(void *private)
-{
- int i;
-
- for (i = 0; i < viafb_gpio_config.gpio_chip.ngpio; i += 2)
- viafb_gpio_enable(viafb_gpio_config.active_gpios[i]);
- return 0;
-}
-
-static struct viafb_pm_hooks viafb_gpio_pm_hooks = {
- .suspend = viafb_gpio_suspend,
- .resume = viafb_gpio_resume
-};
-#endif /* CONFIG_PM */
-
-/*
- * Look up a specific gpio and return the number it was assigned.
- */
-int viafb_gpio_lookup(const char *name)
-{
- int i;
-
- for (i = 0; i < viafb_gpio_config.gpio_chip.ngpio; i++)
- if (!strcmp(name, viafb_gpio_config.active_gpios[i]->vg_name))
- return viafb_gpio_config.gpio_chip.base + i;
- return -1;
-}
-EXPORT_SYMBOL_GPL(viafb_gpio_lookup);
-
-/*
- * Platform device stuff.
- */
-static int viafb_gpio_probe(struct platform_device *platdev)
-{
- struct viafb_dev *vdev = platdev->dev.platform_data;
- struct via_port_cfg *port_cfg = vdev->port_cfg;
- int i, ngpio = 0, ret;
- struct viafb_gpio *gpio;
- unsigned long flags;
-
- /*
- * Set up entries for all GPIOs which have been configured to
- * operate as such (as opposed to as i2c ports).
- */
- for (i = 0; i < VIAFB_NUM_PORTS; i++) {
- if (port_cfg[i].mode != VIA_MODE_GPIO)
- continue;
- for (gpio = viafb_all_gpios;
- gpio < viafb_all_gpios + VIAFB_NUM_GPIOS; gpio++)
- if (gpio->vg_port_index == port_cfg[i].ioport_index) {
- viafb_gpio_config.active_gpios[ngpio] = gpio;
- viafb_gpio_config.gpio_names[ngpio] =
- gpio->vg_name;
- ngpio++;
- }
- }
- viafb_gpio_config.gpio_chip.ngpio = ngpio;
- viafb_gpio_config.gpio_chip.names = viafb_gpio_config.gpio_names;
- viafb_gpio_config.vdev = vdev;
- if (ngpio == 0) {
- printk(KERN_INFO "viafb: no GPIOs configured\n");
- return 0;
- }
- /*
- * Enable the ports. They come in pairs, with a single
- * enable bit for both.
- */
- spin_lock_irqsave(&viafb_gpio_config.vdev->reg_lock, flags);
- for (i = 0; i < ngpio; i += 2)
- viafb_gpio_enable(viafb_gpio_config.active_gpios[i]);
- spin_unlock_irqrestore(&viafb_gpio_config.vdev->reg_lock, flags);
- /*
- * Get registered.
- */
- viafb_gpio_config.gpio_chip.base = -1; /* Dynamic */
- ret = gpiochip_add(&viafb_gpio_config.gpio_chip);
- if (ret) {
- printk(KERN_ERR "viafb: failed to add gpios (%d)\n", ret);
- viafb_gpio_config.gpio_chip.ngpio = 0;
- }
-#ifdef CONFIG_PM
- viafb_pm_register(&viafb_gpio_pm_hooks);
-#endif
- return ret;
-}
-
-
-static int viafb_gpio_remove(struct platform_device *platdev)
-{
- unsigned long flags;
- int ret = 0, i;
-
-#ifdef CONFIG_PM
- viafb_pm_unregister(&viafb_gpio_pm_hooks);
-#endif
-
- /*
- * Get unregistered.
- */
- if (viafb_gpio_config.gpio_chip.ngpio > 0) {
- ret = gpiochip_remove(&viafb_gpio_config.gpio_chip);
- if (ret) { /* Somebody still using it? */
- printk(KERN_ERR "Viafb: GPIO remove failed\n");
- return ret;
- }
- }
- /*
- * Disable the ports.
- */
- spin_lock_irqsave(&viafb_gpio_config.vdev->reg_lock, flags);
- for (i = 0; i < viafb_gpio_config.gpio_chip.ngpio; i += 2)
- viafb_gpio_disable(viafb_gpio_config.active_gpios[i]);
- viafb_gpio_config.gpio_chip.ngpio = 0;
- spin_unlock_irqrestore(&viafb_gpio_config.vdev->reg_lock, flags);
- return ret;
-}
-
-static struct platform_driver via_gpio_driver = {
- .driver = {
- .name = "viafb-gpio",
- },
- .probe = viafb_gpio_probe,
- .remove = viafb_gpio_remove,
-};
-
-int viafb_gpio_init(void)
-{
- return platform_driver_register(&via_gpio_driver);
-}
-
-void viafb_gpio_exit(void)
-{
- platform_driver_unregister(&via_gpio_driver);
-}
diff --git a/drivers/video/via/via_aux.c b/drivers/video/via/via_aux.c
deleted file mode 100644
index 4a0a55cdac3d..000000000000
--- a/drivers/video/via/via_aux.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * infrastructure for devices connected via I2C
- */
-
-#include <linux/slab.h>
-#include "via_aux.h"
-
-
-struct via_aux_bus *via_aux_probe(struct i2c_adapter *adap)
-{
- struct via_aux_bus *bus;
-
- if (!adap)
- return NULL;
-
- bus = kmalloc(sizeof(*bus), GFP_KERNEL);
- if (!bus)
- return NULL;
-
- bus->adap = adap;
- INIT_LIST_HEAD(&bus->drivers);
-
- via_aux_edid_probe(bus);
- via_aux_vt1636_probe(bus);
- via_aux_vt1632_probe(bus);
- via_aux_vt1631_probe(bus);
- via_aux_vt1625_probe(bus);
- via_aux_vt1622_probe(bus);
- via_aux_vt1621_probe(bus);
- via_aux_sii164_probe(bus);
- via_aux_ch7301_probe(bus);
-
- return bus;
-}
-
-void via_aux_free(struct via_aux_bus *bus)
-{
- struct via_aux_drv *pos, *n;
-
- if (!bus)
- return;
-
- list_for_each_entry_safe(pos, n, &bus->drivers, chain) {
- if (pos->cleanup)
- pos->cleanup(pos);
-
- list_del(&pos->chain);
- kfree(pos->data);
- kfree(pos);
- }
-
- kfree(bus);
-}
-
-const struct fb_videomode *via_aux_get_preferred_mode(struct via_aux_bus *bus)
-{
- struct via_aux_drv *pos;
- const struct fb_videomode *mode = NULL;
-
- if (!bus)
- return NULL;
-
- list_for_each_entry(pos, &bus->drivers, chain) {
- if (pos->get_preferred_mode)
- mode = pos->get_preferred_mode(pos);
- }
-
- return mode;
-}
diff --git a/drivers/video/via/via_aux.h b/drivers/video/via/via_aux.h
deleted file mode 100644
index a8de3f038cea..000000000000
--- a/drivers/video/via/via_aux.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * infrastructure for devices connected via I2C
- */
-
-#ifndef __VIA_AUX_H__
-#define __VIA_AUX_H__
-
-
-#include <linux/list.h>
-#include <linux/i2c.h>
-#include <linux/fb.h>
-
-
-struct via_aux_bus {
- struct i2c_adapter *adap; /* the I2C device to access the bus */
- struct list_head drivers; /* drivers for devices on this bus */
-};
-
-struct via_aux_drv {
- struct list_head chain; /* chain to support multiple drivers */
-
- struct via_aux_bus *bus; /* the I2C bus used */
- u8 addr; /* the I2C slave address */
-
- const char *name; /* human readable name of the driver */
- void *data; /* private data of this driver */
-
- void (*cleanup)(struct via_aux_drv *drv);
- const struct fb_videomode* (*get_preferred_mode)
- (struct via_aux_drv *drv);
-};
-
-
-struct via_aux_bus *via_aux_probe(struct i2c_adapter *adap);
-void via_aux_free(struct via_aux_bus *bus);
-const struct fb_videomode *via_aux_get_preferred_mode(struct via_aux_bus *bus);
-
-
-static inline bool via_aux_add(struct via_aux_drv *drv)
-{
- struct via_aux_drv *data = kmalloc(sizeof(*data), GFP_KERNEL);
-
- if (!data)
- return false;
-
- *data = *drv;
- list_add_tail(&data->chain, &data->bus->drivers);
- return true;
-}
-
-static inline bool via_aux_read(struct via_aux_drv *drv, u8 start, u8 *buf,
- u8 len)
-{
- struct i2c_msg msg[2] = {
- {.addr = drv->addr, .flags = 0, .len = 1, .buf = &start},
- {.addr = drv->addr, .flags = I2C_M_RD, .len = len, .buf = buf} };
-
- return i2c_transfer(drv->bus->adap, msg, 2) == 2;
-}
-
-
-/* probe functions of existing drivers - should only be called in via_aux.c */
-void via_aux_ch7301_probe(struct via_aux_bus *bus);
-void via_aux_edid_probe(struct via_aux_bus *bus);
-void via_aux_sii164_probe(struct via_aux_bus *bus);
-void via_aux_vt1636_probe(struct via_aux_bus *bus);
-void via_aux_vt1632_probe(struct via_aux_bus *bus);
-void via_aux_vt1631_probe(struct via_aux_bus *bus);
-void via_aux_vt1625_probe(struct via_aux_bus *bus);
-void via_aux_vt1622_probe(struct via_aux_bus *bus);
-void via_aux_vt1621_probe(struct via_aux_bus *bus);
-
-
-#endif /* __VIA_AUX_H__ */
diff --git a/drivers/video/via/via_aux_ch7301.c b/drivers/video/via/via_aux_ch7301.c
deleted file mode 100644
index 1cbe5037a6b0..000000000000
--- a/drivers/video/via/via_aux_ch7301.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * driver for Chrontel CH7301 DVI Transmitter
- */
-
-#include <linux/slab.h>
-#include "via_aux.h"
-
-
-static const char *name = "CH7301 DVI Transmitter";
-
-
-static void probe(struct via_aux_bus *bus, u8 addr)
-{
- struct via_aux_drv drv = {
- .bus = bus,
- .addr = addr,
- .name = name};
- u8 tmp;
-
- if (!via_aux_read(&drv, 0x4B, &tmp, 1) || tmp != 0x17)
- return;
-
- printk(KERN_INFO "viafb: Found %s at address 0x%x\n", name, addr);
- via_aux_add(&drv);
-}
-
-void via_aux_ch7301_probe(struct via_aux_bus *bus)
-{
- probe(bus, 0x75);
- probe(bus, 0x76);
-}
diff --git a/drivers/video/via/via_aux_edid.c b/drivers/video/via/via_aux_edid.c
deleted file mode 100644
index 754d4509033f..000000000000
--- a/drivers/video/via/via_aux_edid.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * generic EDID driver
- */
-
-#include <linux/slab.h>
-#include <linux/fb.h>
-#include "via_aux.h"
-#include "../edid.h"
-
-
-static const char *name = "EDID";
-
-
-static void query_edid(struct via_aux_drv *drv)
-{
- struct fb_monspecs *spec = drv->data;
- unsigned char edid[EDID_LENGTH];
- bool valid = false;
-
- if (spec) {
- fb_destroy_modedb(spec->modedb);
- } else {
- spec = kmalloc(sizeof(*spec), GFP_KERNEL);
- if (!spec)
- return;
- }
-
- spec->version = spec->revision = 0;
- if (via_aux_read(drv, 0x00, edid, EDID_LENGTH)) {
- fb_edid_to_monspecs(edid, spec);
- valid = spec->version || spec->revision;
- }
-
- if (!valid) {
- kfree(spec);
- spec = NULL;
- } else
- printk(KERN_DEBUG "EDID: %s %s\n", spec->manufacturer, spec->monitor);
-
- drv->data = spec;
-}
-
-static const struct fb_videomode *get_preferred_mode(struct via_aux_drv *drv)
-{
- struct fb_monspecs *spec = drv->data;
- int i;
-
- if (!spec || !spec->modedb || !(spec->misc & FB_MISC_1ST_DETAIL))
- return NULL;
-
- for (i = 0; i < spec->modedb_len; i++) {
- if (spec->modedb[i].flag & FB_MODE_IS_FIRST &&
- spec->modedb[i].flag & FB_MODE_IS_DETAILED)
- return &spec->modedb[i];
- }
-
- return NULL;
-}
-
-static void cleanup(struct via_aux_drv *drv)
-{
- struct fb_monspecs *spec = drv->data;
-
- if (spec)
- fb_destroy_modedb(spec->modedb);
-}
-
-void via_aux_edid_probe(struct via_aux_bus *bus)
-{
- struct via_aux_drv drv = {
- .bus = bus,
- .addr = 0x50,
- .name = name,
- .cleanup = cleanup,
- .get_preferred_mode = get_preferred_mode};
-
- query_edid(&drv);
-
- /* as EDID devices can be connected/disconnected just add the driver */
- via_aux_add(&drv);
-}
diff --git a/drivers/video/via/via_aux_sii164.c b/drivers/video/via/via_aux_sii164.c
deleted file mode 100644
index ca1b35f033b1..000000000000
--- a/drivers/video/via/via_aux_sii164.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * driver for Silicon Image SiI 164 PanelLink Transmitter
- */
-
-#include <linux/slab.h>
-#include "via_aux.h"
-
-
-static const char *name = "SiI 164 PanelLink Transmitter";
-
-
-static void probe(struct via_aux_bus *bus, u8 addr)
-{
- struct via_aux_drv drv = {
- .bus = bus,
- .addr = addr,
- .name = name};
- /* check vendor id and device id */
- const u8 id[] = {0x01, 0x00, 0x06, 0x00}, len = ARRAY_SIZE(id);
- u8 tmp[len];
-
- if (!via_aux_read(&drv, 0x00, tmp, len) || memcmp(id, tmp, len))
- return;
-
- printk(KERN_INFO "viafb: Found %s at address 0x%x\n", name, addr);
- via_aux_add(&drv);
-}
-
-void via_aux_sii164_probe(struct via_aux_bus *bus)
-{
- u8 i;
-
- for (i = 0x38; i <= 0x3F; i++)
- probe(bus, i);
-}
diff --git a/drivers/video/via/via_aux_vt1621.c b/drivers/video/via/via_aux_vt1621.c
deleted file mode 100644
index 38eca8479898..000000000000
--- a/drivers/video/via/via_aux_vt1621.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * driver for VIA VT1621(M) TV Encoder
- */
-
-#include <linux/slab.h>
-#include "via_aux.h"
-
-
-static const char *name = "VT1621(M) TV Encoder";
-
-
-void via_aux_vt1621_probe(struct via_aux_bus *bus)
-{
- struct via_aux_drv drv = {
- .bus = bus,
- .addr = 0x20,
- .name = name};
- u8 tmp;
-
- if (!via_aux_read(&drv, 0x1B, &tmp, 1) || tmp != 0x02)
- return;
-
- printk(KERN_INFO "viafb: Found %s\n", name);
- via_aux_add(&drv);
-}
diff --git a/drivers/video/via/via_aux_vt1622.c b/drivers/video/via/via_aux_vt1622.c
deleted file mode 100644
index 8c79c68ba683..000000000000
--- a/drivers/video/via/via_aux_vt1622.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * driver for VIA VT1622(M) Digital TV Encoder
- */
-
-#include <linux/slab.h>
-#include "via_aux.h"
-
-
-static const char *name = "VT1622(M) Digital TV Encoder";
-
-
-static void probe(struct via_aux_bus *bus, u8 addr)
-{
- struct via_aux_drv drv = {
- .bus = bus,
- .addr = addr,
- .name = name};
- u8 tmp;
-
- if (!via_aux_read(&drv, 0x1B, &tmp, 1) || tmp != 0x03)
- return;
-
- printk(KERN_INFO "viafb: Found %s at address 0x%x\n", name, addr);
- via_aux_add(&drv);
-}
-
-void via_aux_vt1622_probe(struct via_aux_bus *bus)
-{
- probe(bus, 0x20);
- probe(bus, 0x21);
-}
diff --git a/drivers/video/via/via_aux_vt1625.c b/drivers/video/via/via_aux_vt1625.c
deleted file mode 100644
index 03eb30165d36..000000000000
--- a/drivers/video/via/via_aux_vt1625.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * driver for VIA VT1625(M) HDTV Encoder
- */
-
-#include <linux/slab.h>
-#include "via_aux.h"
-
-
-static const char *name = "VT1625(M) HDTV Encoder";
-
-
-static void probe(struct via_aux_bus *bus, u8 addr)
-{
- struct via_aux_drv drv = {
- .bus = bus,
- .addr = addr,
- .name = name};
- u8 tmp;
-
- if (!via_aux_read(&drv, 0x1B, &tmp, 1) || tmp != 0x50)
- return;
-
- printk(KERN_INFO "viafb: Found %s at address 0x%x\n", name, addr);
- via_aux_add(&drv);
-}
-
-void via_aux_vt1625_probe(struct via_aux_bus *bus)
-{
- probe(bus, 0x20);
- probe(bus, 0x21);
-}
diff --git a/drivers/video/via/via_aux_vt1631.c b/drivers/video/via/via_aux_vt1631.c
deleted file mode 100644
index 06e742f1f723..000000000000
--- a/drivers/video/via/via_aux_vt1631.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * driver for VIA VT1631 LVDS Transmitter
- */
-
-#include <linux/slab.h>
-#include "via_aux.h"
-
-
-static const char *name = "VT1631 LVDS Transmitter";
-
-
-void via_aux_vt1631_probe(struct via_aux_bus *bus)
-{
- struct via_aux_drv drv = {
- .bus = bus,
- .addr = 0x38,
- .name = name};
- /* check vendor id and device id */
- const u8 id[] = {0x06, 0x11, 0x91, 0x31}, len = ARRAY_SIZE(id);
- u8 tmp[len];
-
- if (!via_aux_read(&drv, 0x00, tmp, len) || memcmp(id, tmp, len))
- return;
-
- printk(KERN_INFO "viafb: Found %s\n", name);
- via_aux_add(&drv);
-}
diff --git a/drivers/video/via/via_aux_vt1632.c b/drivers/video/via/via_aux_vt1632.c
deleted file mode 100644
index d24f4cd97401..000000000000
--- a/drivers/video/via/via_aux_vt1632.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * driver for VIA VT1632 DVI Transmitter
- */
-
-#include <linux/slab.h>
-#include "via_aux.h"
-
-
-static const char *name = "VT1632 DVI Transmitter";
-
-
-static void probe(struct via_aux_bus *bus, u8 addr)
-{
- struct via_aux_drv drv = {
- .bus = bus,
- .addr = addr,
- .name = name};
- /* check vendor id and device id */
- const u8 id[] = {0x06, 0x11, 0x92, 0x31}, len = ARRAY_SIZE(id);
- u8 tmp[len];
-
- if (!via_aux_read(&drv, 0x00, tmp, len) || memcmp(id, tmp, len))
- return;
-
- printk(KERN_INFO "viafb: Found %s at address 0x%x\n", name, addr);
- via_aux_add(&drv);
-}
-
-void via_aux_vt1632_probe(struct via_aux_bus *bus)
-{
- u8 i;
-
- for (i = 0x08; i <= 0x0F; i++)
- probe(bus, i);
-}
diff --git a/drivers/video/via/via_aux_vt1636.c b/drivers/video/via/via_aux_vt1636.c
deleted file mode 100644
index 9e015c101d4d..000000000000
--- a/drivers/video/via/via_aux_vt1636.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * driver for VIA VT1636 LVDS Transmitter
- */
-
-#include <linux/slab.h>
-#include "via_aux.h"
-
-
-static const char *name = "VT1636 LVDS Transmitter";
-
-
-void via_aux_vt1636_probe(struct via_aux_bus *bus)
-{
- struct via_aux_drv drv = {
- .bus = bus,
- .addr = 0x40,
- .name = name};
- /* check vendor id and device id */
- const u8 id[] = {0x06, 0x11, 0x45, 0x33}, len = ARRAY_SIZE(id);
- u8 tmp[len];
-
- if (!via_aux_read(&drv, 0x00, tmp, len) || memcmp(id, tmp, len))
- return;
-
- printk(KERN_INFO "viafb: Found %s\n", name);
- via_aux_add(&drv);
-}
diff --git a/drivers/video/via/via_clock.c b/drivers/video/via/via_clock.c
deleted file mode 100644
index db1e39277e32..000000000000
--- a/drivers/video/via/via_clock.c
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * clock and PLL management functions
- */
-
-#include <linux/kernel.h>
-#include <linux/via-core.h>
-#include <asm/olpc.h>
-#include "via_clock.h"
-#include "global.h"
-#include "debug.h"
-
-const char *via_slap = "Please slap VIA Technologies to motivate them "
- "releasing full documentation for your platform!\n";
-
-static inline u32 cle266_encode_pll(struct via_pll_config pll)
-{
- return (pll.multiplier << 8)
- | (pll.rshift << 6)
- | pll.divisor;
-}
-
-static inline u32 k800_encode_pll(struct via_pll_config pll)
-{
- return ((pll.divisor - 2) << 16)
- | (pll.rshift << 10)
- | (pll.multiplier - 2);
-}
-
-static inline u32 vx855_encode_pll(struct via_pll_config pll)
-{
- return (pll.divisor << 16)
- | (pll.rshift << 10)
- | pll.multiplier;
-}
-
-static inline void cle266_set_primary_pll_encoded(u32 data)
-{
- via_write_reg_mask(VIASR, 0x40, 0x02, 0x02); /* enable reset */
- via_write_reg(VIASR, 0x46, data & 0xFF);
- via_write_reg(VIASR, 0x47, (data >> 8) & 0xFF);
- via_write_reg_mask(VIASR, 0x40, 0x00, 0x02); /* disable reset */
-}
-
-static inline void k800_set_primary_pll_encoded(u32 data)
-{
- via_write_reg_mask(VIASR, 0x40, 0x02, 0x02); /* enable reset */
- via_write_reg(VIASR, 0x44, data & 0xFF);
- via_write_reg(VIASR, 0x45, (data >> 8) & 0xFF);
- via_write_reg(VIASR, 0x46, (data >> 16) & 0xFF);
- via_write_reg_mask(VIASR, 0x40, 0x00, 0x02); /* disable reset */
-}
-
-static inline void cle266_set_secondary_pll_encoded(u32 data)
-{
- via_write_reg_mask(VIASR, 0x40, 0x04, 0x04); /* enable reset */
- via_write_reg(VIASR, 0x44, data & 0xFF);
- via_write_reg(VIASR, 0x45, (data >> 8) & 0xFF);
- via_write_reg_mask(VIASR, 0x40, 0x00, 0x04); /* disable reset */
-}
-
-static inline void k800_set_secondary_pll_encoded(u32 data)
-{
- via_write_reg_mask(VIASR, 0x40, 0x04, 0x04); /* enable reset */
- via_write_reg(VIASR, 0x4A, data & 0xFF);
- via_write_reg(VIASR, 0x4B, (data >> 8) & 0xFF);
- via_write_reg(VIASR, 0x4C, (data >> 16) & 0xFF);
- via_write_reg_mask(VIASR, 0x40, 0x00, 0x04); /* disable reset */
-}
-
-static inline void set_engine_pll_encoded(u32 data)
-{
- via_write_reg_mask(VIASR, 0x40, 0x01, 0x01); /* enable reset */
- via_write_reg(VIASR, 0x47, data & 0xFF);
- via_write_reg(VIASR, 0x48, (data >> 8) & 0xFF);
- via_write_reg(VIASR, 0x49, (data >> 16) & 0xFF);
- via_write_reg_mask(VIASR, 0x40, 0x00, 0x01); /* disable reset */
-}
-
-static void cle266_set_primary_pll(struct via_pll_config config)
-{
- cle266_set_primary_pll_encoded(cle266_encode_pll(config));
-}
-
-static void k800_set_primary_pll(struct via_pll_config config)
-{
- k800_set_primary_pll_encoded(k800_encode_pll(config));
-}
-
-static void vx855_set_primary_pll(struct via_pll_config config)
-{
- k800_set_primary_pll_encoded(vx855_encode_pll(config));
-}
-
-static void cle266_set_secondary_pll(struct via_pll_config config)
-{
- cle266_set_secondary_pll_encoded(cle266_encode_pll(config));
-}
-
-static void k800_set_secondary_pll(struct via_pll_config config)
-{
- k800_set_secondary_pll_encoded(k800_encode_pll(config));
-}
-
-static void vx855_set_secondary_pll(struct via_pll_config config)
-{
- k800_set_secondary_pll_encoded(vx855_encode_pll(config));
-}
-
-static void k800_set_engine_pll(struct via_pll_config config)
-{
- set_engine_pll_encoded(k800_encode_pll(config));
-}
-
-static void vx855_set_engine_pll(struct via_pll_config config)
-{
- set_engine_pll_encoded(vx855_encode_pll(config));
-}
-
-static void set_primary_pll_state(u8 state)
-{
- u8 value;
-
- switch (state) {
- case VIA_STATE_ON:
- value = 0x20;
- break;
- case VIA_STATE_OFF:
- value = 0x00;
- break;
- default:
- return;
- }
-
- via_write_reg_mask(VIASR, 0x2D, value, 0x30);
-}
-
-static void set_secondary_pll_state(u8 state)
-{
- u8 value;
-
- switch (state) {
- case VIA_STATE_ON:
- value = 0x08;
- break;
- case VIA_STATE_OFF:
- value = 0x00;
- break;
- default:
- return;
- }
-
- via_write_reg_mask(VIASR, 0x2D, value, 0x0C);
-}
-
-static void set_engine_pll_state(u8 state)
-{
- u8 value;
-
- switch (state) {
- case VIA_STATE_ON:
- value = 0x02;
- break;
- case VIA_STATE_OFF:
- value = 0x00;
- break;
- default:
- return;
- }
-
- via_write_reg_mask(VIASR, 0x2D, value, 0x03);
-}
-
-static void set_primary_clock_state(u8 state)
-{
- u8 value;
-
- switch (state) {
- case VIA_STATE_ON:
- value = 0x20;
- break;
- case VIA_STATE_OFF:
- value = 0x00;
- break;
- default:
- return;
- }
-
- via_write_reg_mask(VIASR, 0x1B, value, 0x30);
-}
-
-static void set_secondary_clock_state(u8 state)
-{
- u8 value;
-
- switch (state) {
- case VIA_STATE_ON:
- value = 0x80;
- break;
- case VIA_STATE_OFF:
- value = 0x00;
- break;
- default:
- return;
- }
-
- via_write_reg_mask(VIASR, 0x1B, value, 0xC0);
-}
-
-static inline u8 set_clock_source_common(enum via_clksrc source, bool use_pll)
-{
- u8 data = 0;
-
- switch (source) {
- case VIA_CLKSRC_X1:
- data = 0x00;
- break;
- case VIA_CLKSRC_TVX1:
- data = 0x02;
- break;
- case VIA_CLKSRC_TVPLL:
- data = 0x04; /* 0x06 should be the same */
- break;
- case VIA_CLKSRC_DVP1TVCLKR:
- data = 0x0A;
- break;
- case VIA_CLKSRC_CAP0:
- data = 0xC;
- break;
- case VIA_CLKSRC_CAP1:
- data = 0x0E;
- break;
- }
-
- if (!use_pll)
- data |= 1;
-
- return data;
-}
-
-static void set_primary_clock_source(enum via_clksrc source, bool use_pll)
-{
- u8 data = set_clock_source_common(source, use_pll) << 4;
- via_write_reg_mask(VIACR, 0x6C, data, 0xF0);
-}
-
-static void set_secondary_clock_source(enum via_clksrc source, bool use_pll)
-{
- u8 data = set_clock_source_common(source, use_pll);
- via_write_reg_mask(VIACR, 0x6C, data, 0x0F);
-}
-
-static void dummy_set_clock_state(u8 state)
-{
- printk(KERN_INFO "Using undocumented set clock state.\n%s", via_slap);
-}
-
-static void dummy_set_clock_source(enum via_clksrc source, bool use_pll)
-{
- printk(KERN_INFO "Using undocumented set clock source.\n%s", via_slap);
-}
-
-static void dummy_set_pll_state(u8 state)
-{
- printk(KERN_INFO "Using undocumented set PLL state.\n%s", via_slap);
-}
-
-static void dummy_set_pll(struct via_pll_config config)
-{
- printk(KERN_INFO "Using undocumented set PLL.\n%s", via_slap);
-}
-
-static void noop_set_clock_state(u8 state)
-{
-}
-
-void via_clock_init(struct via_clock *clock, int gfx_chip)
-{
- switch (gfx_chip) {
- case UNICHROME_CLE266:
- case UNICHROME_K400:
- clock->set_primary_clock_state = dummy_set_clock_state;
- clock->set_primary_clock_source = dummy_set_clock_source;
- clock->set_primary_pll_state = dummy_set_pll_state;
- clock->set_primary_pll = cle266_set_primary_pll;
-
- clock->set_secondary_clock_state = dummy_set_clock_state;
- clock->set_secondary_clock_source = dummy_set_clock_source;
- clock->set_secondary_pll_state = dummy_set_pll_state;
- clock->set_secondary_pll = cle266_set_secondary_pll;
-
- clock->set_engine_pll_state = dummy_set_pll_state;
- clock->set_engine_pll = dummy_set_pll;
- break;
- case UNICHROME_K800:
- case UNICHROME_PM800:
- case UNICHROME_CN700:
- case UNICHROME_CX700:
- case UNICHROME_CN750:
- case UNICHROME_K8M890:
- case UNICHROME_P4M890:
- case UNICHROME_P4M900:
- case UNICHROME_VX800:
- clock->set_primary_clock_state = set_primary_clock_state;
- clock->set_primary_clock_source = set_primary_clock_source;
- clock->set_primary_pll_state = set_primary_pll_state;
- clock->set_primary_pll = k800_set_primary_pll;
-
- clock->set_secondary_clock_state = set_secondary_clock_state;
- clock->set_secondary_clock_source = set_secondary_clock_source;
- clock->set_secondary_pll_state = set_secondary_pll_state;
- clock->set_secondary_pll = k800_set_secondary_pll;
-
- clock->set_engine_pll_state = set_engine_pll_state;
- clock->set_engine_pll = k800_set_engine_pll;
- break;
- case UNICHROME_VX855:
- case UNICHROME_VX900:
- clock->set_primary_clock_state = set_primary_clock_state;
- clock->set_primary_clock_source = set_primary_clock_source;
- clock->set_primary_pll_state = set_primary_pll_state;
- clock->set_primary_pll = vx855_set_primary_pll;
-
- clock->set_secondary_clock_state = set_secondary_clock_state;
- clock->set_secondary_clock_source = set_secondary_clock_source;
- clock->set_secondary_pll_state = set_secondary_pll_state;
- clock->set_secondary_pll = vx855_set_secondary_pll;
-
- clock->set_engine_pll_state = set_engine_pll_state;
- clock->set_engine_pll = vx855_set_engine_pll;
- break;
-
- }
-
- if (machine_is_olpc()) {
- /* The OLPC XO-1.5 cannot suspend/resume reliably if the
- * IGA1/IGA2 clocks are set as on or off (memory rot
- * occasionally happens during suspend under such
- * configurations).
- *
- * The only known stable scenario is to leave this bits as-is,
- * which in their default states are documented to enable the
- * clock only when it is needed.
- */
- clock->set_primary_clock_state = noop_set_clock_state;
- clock->set_secondary_clock_state = noop_set_clock_state;
- }
-}
diff --git a/drivers/video/via/via_clock.h b/drivers/video/via/via_clock.h
deleted file mode 100644
index 88714ae0d157..000000000000
--- a/drivers/video/via/via_clock.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
- * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * clock and PLL management functions
- */
-
-#ifndef __VIA_CLOCK_H__
-#define __VIA_CLOCK_H__
-
-#include <linux/types.h>
-
-enum via_clksrc {
- VIA_CLKSRC_X1 = 0,
- VIA_CLKSRC_TVX1,
- VIA_CLKSRC_TVPLL,
- VIA_CLKSRC_DVP1TVCLKR,
- VIA_CLKSRC_CAP0,
- VIA_CLKSRC_CAP1,
-};
-
-struct via_pll_config {
- u16 multiplier;
- u8 divisor;
- u8 rshift;
-};
-
-struct via_clock {
- void (*set_primary_clock_state)(u8 state);
- void (*set_primary_clock_source)(enum via_clksrc src, bool use_pll);
- void (*set_primary_pll_state)(u8 state);
- void (*set_primary_pll)(struct via_pll_config config);
-
- void (*set_secondary_clock_state)(u8 state);
- void (*set_secondary_clock_source)(enum via_clksrc src, bool use_pll);
- void (*set_secondary_pll_state)(u8 state);
- void (*set_secondary_pll)(struct via_pll_config config);
-
- void (*set_engine_pll_state)(u8 state);
- void (*set_engine_pll)(struct via_pll_config config);
-};
-
-
-static inline u32 get_pll_internal_frequency(u32 ref_freq,
- struct via_pll_config pll)
-{
- return ref_freq / pll.divisor * pll.multiplier;
-}
-
-static inline u32 get_pll_output_frequency(u32 ref_freq,
- struct via_pll_config pll)
-{
- return get_pll_internal_frequency(ref_freq, pll) >> pll.rshift;
-}
-
-void via_clock_init(struct via_clock *clock, int gfx_chip);
-
-#endif /* __VIA_CLOCK_H__ */
diff --git a/drivers/video/via/via_i2c.c b/drivers/video/via/via_i2c.c
deleted file mode 100644
index dd53058bbbb7..000000000000
--- a/drivers/video/via/via_i2c.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright 1998-2009 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <linux/platform_device.h>
-#include <linux/delay.h>
-#include <linux/spinlock.h>
-#include <linux/module.h>
-#include <linux/via-core.h>
-#include <linux/via_i2c.h>
-
-/*
- * There can only be one set of these, so there's no point in having
- * them be dynamically allocated...
- */
-#define VIAFB_NUM_I2C 5
-static struct via_i2c_stuff via_i2c_par[VIAFB_NUM_I2C];
-static struct viafb_dev *i2c_vdev; /* Passed in from core */
-
-static void via_i2c_setscl(void *data, int state)
-{
- u8 val;
- struct via_port_cfg *adap_data = data;
- unsigned long flags;
-
- spin_lock_irqsave(&i2c_vdev->reg_lock, flags);
- val = via_read_reg(adap_data->io_port, adap_data->ioport_index) & 0xF0;
- if (state)
- val |= 0x20;
- else
- val &= ~0x20;
- switch (adap_data->type) {
- case VIA_PORT_I2C:
- val |= 0x01;
- break;
- case VIA_PORT_GPIO:
- val |= 0x82;
- break;
- default:
- printk(KERN_ERR "viafb_i2c: specify wrong i2c type.\n");
- }
- via_write_reg(adap_data->io_port, adap_data->ioport_index, val);
- spin_unlock_irqrestore(&i2c_vdev->reg_lock, flags);
-}
-
-static int via_i2c_getscl(void *data)
-{
- struct via_port_cfg *adap_data = data;
- unsigned long flags;
- int ret = 0;
-
- spin_lock_irqsave(&i2c_vdev->reg_lock, flags);
- if (adap_data->type == VIA_PORT_GPIO)
- via_write_reg_mask(adap_data->io_port, adap_data->ioport_index,
- 0, 0x80);
- if (via_read_reg(adap_data->io_port, adap_data->ioport_index) & 0x08)
- ret = 1;
- spin_unlock_irqrestore(&i2c_vdev->reg_lock, flags);
- return ret;
-}
-
-static int via_i2c_getsda(void *data)
-{
- struct via_port_cfg *adap_data = data;
- unsigned long flags;
- int ret = 0;
-
- spin_lock_irqsave(&i2c_vdev->reg_lock, flags);
- if (adap_data->type == VIA_PORT_GPIO)
- via_write_reg_mask(adap_data->io_port, adap_data->ioport_index,
- 0, 0x40);
- if (via_read_reg(adap_data->io_port, adap_data->ioport_index) & 0x04)
- ret = 1;
- spin_unlock_irqrestore(&i2c_vdev->reg_lock, flags);
- return ret;
-}
-
-static void via_i2c_setsda(void *data, int state)
-{
- u8 val;
- struct via_port_cfg *adap_data = data;
- unsigned long flags;
-
- spin_lock_irqsave(&i2c_vdev->reg_lock, flags);
- val = via_read_reg(adap_data->io_port, adap_data->ioport_index) & 0xF0;
- if (state)
- val |= 0x10;
- else
- val &= ~0x10;
- switch (adap_data->type) {
- case VIA_PORT_I2C:
- val |= 0x01;
- break;
- case VIA_PORT_GPIO:
- val |= 0x42;
- break;
- default:
- printk(KERN_ERR "viafb_i2c: specify wrong i2c type.\n");
- }
- via_write_reg(adap_data->io_port, adap_data->ioport_index, val);
- spin_unlock_irqrestore(&i2c_vdev->reg_lock, flags);
-}
-
-int viafb_i2c_readbyte(u8 adap, u8 slave_addr, u8 index, u8 *pdata)
-{
- int ret;
- u8 mm1[] = {0x00};
- struct i2c_msg msgs[2];
-
- if (!via_i2c_par[adap].is_active)
- return -ENODEV;
- *pdata = 0;
- msgs[0].flags = 0;
- msgs[1].flags = I2C_M_RD;
- msgs[0].addr = msgs[1].addr = slave_addr / 2;
- mm1[0] = index;
- msgs[0].len = 1; msgs[1].len = 1;
- msgs[0].buf = mm1; msgs[1].buf = pdata;
- ret = i2c_transfer(&via_i2c_par[adap].adapter, msgs, 2);
- if (ret == 2)
- ret = 0;
- else if (ret >= 0)
- ret = -EIO;
-
- return ret;
-}
-
-int viafb_i2c_writebyte(u8 adap, u8 slave_addr, u8 index, u8 data)
-{
- int ret;
- u8 msg[2] = { index, data };
- struct i2c_msg msgs;
-
- if (!via_i2c_par[adap].is_active)
- return -ENODEV;
- msgs.flags = 0;
- msgs.addr = slave_addr / 2;
- msgs.len = 2;
- msgs.buf = msg;
- ret = i2c_transfer(&via_i2c_par[adap].adapter, &msgs, 1);
- if (ret == 1)
- ret = 0;
- else if (ret >= 0)
- ret = -EIO;
-
- return ret;
-}
-
-int viafb_i2c_readbytes(u8 adap, u8 slave_addr, u8 index, u8 *buff, int buff_len)
-{
- int ret;
- u8 mm1[] = {0x00};
- struct i2c_msg msgs[2];
-
- if (!via_i2c_par[adap].is_active)
- return -ENODEV;
- msgs[0].flags = 0;
- msgs[1].flags = I2C_M_RD;
- msgs[0].addr = msgs[1].addr = slave_addr / 2;
- mm1[0] = index;
- msgs[0].len = 1; msgs[1].len = buff_len;
- msgs[0].buf = mm1; msgs[1].buf = buff;
- ret = i2c_transfer(&via_i2c_par[adap].adapter, msgs, 2);
- if (ret == 2)
- ret = 0;
- else if (ret >= 0)
- ret = -EIO;
-
- return ret;
-}
-
-/*
- * Allow other viafb subdevices to look up a specific adapter
- * by port name.
- */
-struct i2c_adapter *viafb_find_i2c_adapter(enum viafb_i2c_adap which)
-{
- struct via_i2c_stuff *stuff = &via_i2c_par[which];
-
- return &stuff->adapter;
-}
-EXPORT_SYMBOL_GPL(viafb_find_i2c_adapter);
-
-
-static int create_i2c_bus(struct i2c_adapter *adapter,
- struct i2c_algo_bit_data *algo,
- struct via_port_cfg *adap_cfg,
- struct pci_dev *pdev)
-{
- algo->setsda = via_i2c_setsda;
- algo->setscl = via_i2c_setscl;
- algo->getsda = via_i2c_getsda;
- algo->getscl = via_i2c_getscl;
- algo->udelay = 10;
- algo->timeout = 2;
- algo->data = adap_cfg;
-
- sprintf(adapter->name, "viafb i2c io_port idx 0x%02x",
- adap_cfg->ioport_index);
- adapter->owner = THIS_MODULE;
- adapter->class = I2C_CLASS_DDC;
- adapter->algo_data = algo;
- if (pdev)
- adapter->dev.parent = &pdev->dev;
- else
- adapter->dev.parent = NULL;
- /* i2c_set_adapdata(adapter, adap_cfg); */
-
- /* Raise SCL and SDA */
- via_i2c_setsda(adap_cfg, 1);
- via_i2c_setscl(adap_cfg, 1);
- udelay(20);
-
- return i2c_bit_add_bus(adapter);
-}
-
-static int viafb_i2c_probe(struct platform_device *platdev)
-{
- int i, ret;
- struct via_port_cfg *configs;
-
- i2c_vdev = platdev->dev.platform_data;
- configs = i2c_vdev->port_cfg;
-
- for (i = 0; i < VIAFB_NUM_PORTS; i++) {
- struct via_port_cfg *adap_cfg = configs++;
- struct via_i2c_stuff *i2c_stuff = &via_i2c_par[i];
-
- i2c_stuff->is_active = 0;
- if (adap_cfg->type == 0 || adap_cfg->mode != VIA_MODE_I2C)
- continue;
- ret = create_i2c_bus(&i2c_stuff->adapter,
- &i2c_stuff->algo, adap_cfg,
- NULL); /* FIXME: PCIDEV */
- if (ret < 0) {
- printk(KERN_ERR "viafb: cannot create i2c bus %u:%d\n",
- i, ret);
- continue; /* Still try to make the rest */
- }
- i2c_stuff->is_active = 1;
- }
-
- return 0;
-}
-
-static int viafb_i2c_remove(struct platform_device *platdev)
-{
- int i;
-
- for (i = 0; i < VIAFB_NUM_PORTS; i++) {
- struct via_i2c_stuff *i2c_stuff = &via_i2c_par[i];
- /*
- * Only remove those entries in the array that we've
- * actually used (and thus initialized algo_data)
- */
- if (i2c_stuff->is_active)
- i2c_del_adapter(&i2c_stuff->adapter);
- }
- return 0;
-}
-
-static struct platform_driver via_i2c_driver = {
- .driver = {
- .name = "viafb-i2c",
- },
- .probe = viafb_i2c_probe,
- .remove = viafb_i2c_remove,
-};
-
-int viafb_i2c_init(void)
-{
- return platform_driver_register(&via_i2c_driver);
-}
-
-void viafb_i2c_exit(void)
-{
- platform_driver_unregister(&via_i2c_driver);
-}
diff --git a/drivers/video/via/via_modesetting.c b/drivers/video/via/via_modesetting.c
deleted file mode 100644
index 0b414b09b9b4..000000000000
--- a/drivers/video/via/via_modesetting.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
- * Copyright 2010 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * basic modesetting functions
- */
-
-#include <linux/kernel.h>
-#include <linux/via-core.h>
-#include "via_modesetting.h"
-#include "share.h"
-#include "debug.h"
-
-
-void via_set_primary_timing(const struct via_display_timing *timing)
-{
- struct via_display_timing raw;
-
- raw.hor_total = timing->hor_total / 8 - 5;
- raw.hor_addr = timing->hor_addr / 8 - 1;
- raw.hor_blank_start = timing->hor_blank_start / 8 - 1;
- raw.hor_blank_end = timing->hor_blank_end / 8 - 1;
- raw.hor_sync_start = timing->hor_sync_start / 8;
- raw.hor_sync_end = timing->hor_sync_end / 8;
- raw.ver_total = timing->ver_total - 2;
- raw.ver_addr = timing->ver_addr - 1;
- raw.ver_blank_start = timing->ver_blank_start - 1;
- raw.ver_blank_end = timing->ver_blank_end - 1;
- raw.ver_sync_start = timing->ver_sync_start - 1;
- raw.ver_sync_end = timing->ver_sync_end - 1;
-
- /* unlock timing registers */
- via_write_reg_mask(VIACR, 0x11, 0x00, 0x80);
-
- via_write_reg(VIACR, 0x00, raw.hor_total & 0xFF);
- via_write_reg(VIACR, 0x01, raw.hor_addr & 0xFF);
- via_write_reg(VIACR, 0x02, raw.hor_blank_start & 0xFF);
- via_write_reg_mask(VIACR, 0x03, raw.hor_blank_end & 0x1F, 0x1F);
- via_write_reg(VIACR, 0x04, raw.hor_sync_start & 0xFF);
- via_write_reg_mask(VIACR, 0x05, (raw.hor_sync_end & 0x1F)
- | (raw.hor_blank_end << (7 - 5) & 0x80), 0x9F);
- via_write_reg(VIACR, 0x06, raw.ver_total & 0xFF);
- via_write_reg_mask(VIACR, 0x07, (raw.ver_total >> 8 & 0x01)
- | (raw.ver_addr >> (8 - 1) & 0x02)
- | (raw.ver_sync_start >> (8 - 2) & 0x04)
- | (raw.ver_blank_start >> (8 - 3) & 0x08)
- | (raw.ver_total >> (9 - 5) & 0x20)
- | (raw.ver_addr >> (9 - 6) & 0x40)
- | (raw.ver_sync_start >> (9 - 7) & 0x80), 0xEF);
- via_write_reg_mask(VIACR, 0x09, raw.ver_blank_start >> (9 - 5) & 0x20,
- 0x20);
- via_write_reg(VIACR, 0x10, raw.ver_sync_start & 0xFF);
- via_write_reg_mask(VIACR, 0x11, raw.ver_sync_end & 0x0F, 0x0F);
- via_write_reg(VIACR, 0x12, raw.ver_addr & 0xFF);
- via_write_reg(VIACR, 0x15, raw.ver_blank_start & 0xFF);
- via_write_reg(VIACR, 0x16, raw.ver_blank_end & 0xFF);
- via_write_reg_mask(VIACR, 0x33, (raw.hor_sync_start >> (8 - 4) & 0x10)
- | (raw.hor_blank_end >> (6 - 5) & 0x20), 0x30);
- via_write_reg_mask(VIACR, 0x35, (raw.ver_total >> 10 & 0x01)
- | (raw.ver_sync_start >> (10 - 1) & 0x02)
- | (raw.ver_addr >> (10 - 2) & 0x04)
- | (raw.ver_blank_start >> (10 - 3) & 0x08), 0x0F);
- via_write_reg_mask(VIACR, 0x36, raw.hor_total >> (8 - 3) & 0x08, 0x08);
-
- /* lock timing registers */
- via_write_reg_mask(VIACR, 0x11, 0x80, 0x80);
-
- /* reset timing control */
- via_write_reg_mask(VIACR, 0x17, 0x00, 0x80);
- via_write_reg_mask(VIACR, 0x17, 0x80, 0x80);
-}
-
-void via_set_secondary_timing(const struct via_display_timing *timing)
-{
- struct via_display_timing raw;
-
- raw.hor_total = timing->hor_total - 1;
- raw.hor_addr = timing->hor_addr - 1;
- raw.hor_blank_start = timing->hor_blank_start - 1;
- raw.hor_blank_end = timing->hor_blank_end - 1;
- raw.hor_sync_start = timing->hor_sync_start - 1;
- raw.hor_sync_end = timing->hor_sync_end - 1;
- raw.ver_total = timing->ver_total - 1;
- raw.ver_addr = timing->ver_addr - 1;
- raw.ver_blank_start = timing->ver_blank_start - 1;
- raw.ver_blank_end = timing->ver_blank_end - 1;
- raw.ver_sync_start = timing->ver_sync_start - 1;
- raw.ver_sync_end = timing->ver_sync_end - 1;
-
- via_write_reg(VIACR, 0x50, raw.hor_total & 0xFF);
- via_write_reg(VIACR, 0x51, raw.hor_addr & 0xFF);
- via_write_reg(VIACR, 0x52, raw.hor_blank_start & 0xFF);
- via_write_reg(VIACR, 0x53, raw.hor_blank_end & 0xFF);
- via_write_reg(VIACR, 0x54, (raw.hor_blank_start >> 8 & 0x07)
- | (raw.hor_blank_end >> (8 - 3) & 0x38)
- | (raw.hor_sync_start >> (8 - 6) & 0xC0));
- via_write_reg_mask(VIACR, 0x55, (raw.hor_total >> 8 & 0x0F)
- | (raw.hor_addr >> (8 - 4) & 0x70), 0x7F);
- via_write_reg(VIACR, 0x56, raw.hor_sync_start & 0xFF);
- via_write_reg(VIACR, 0x57, raw.hor_sync_end & 0xFF);
- via_write_reg(VIACR, 0x58, raw.ver_total & 0xFF);
- via_write_reg(VIACR, 0x59, raw.ver_addr & 0xFF);
- via_write_reg(VIACR, 0x5A, raw.ver_blank_start & 0xFF);
- via_write_reg(VIACR, 0x5B, raw.ver_blank_end & 0xFF);
- via_write_reg(VIACR, 0x5C, (raw.ver_blank_start >> 8 & 0x07)
- | (raw.ver_blank_end >> (8 - 3) & 0x38)
- | (raw.hor_sync_end >> (8 - 6) & 0x40)
- | (raw.hor_sync_start >> (10 - 7) & 0x80));
- via_write_reg(VIACR, 0x5D, (raw.ver_total >> 8 & 0x07)
- | (raw.ver_addr >> (8 - 3) & 0x38)
- | (raw.hor_blank_end >> (11 - 6) & 0x40)
- | (raw.hor_sync_start >> (11 - 7) & 0x80));
- via_write_reg(VIACR, 0x5E, raw.ver_sync_start & 0xFF);
- via_write_reg(VIACR, 0x5F, (raw.ver_sync_end & 0x1F)
- | (raw.ver_sync_start >> (8 - 5) & 0xE0));
-}
-
-void via_set_primary_address(u32 addr)
-{
- DEBUG_MSG(KERN_DEBUG "via_set_primary_address(0x%08X)\n", addr);
- via_write_reg(VIACR, 0x0D, addr & 0xFF);
- via_write_reg(VIACR, 0x0C, (addr >> 8) & 0xFF);
- via_write_reg(VIACR, 0x34, (addr >> 16) & 0xFF);
- via_write_reg_mask(VIACR, 0x48, (addr >> 24) & 0x1F, 0x1F);
-}
-
-void via_set_secondary_address(u32 addr)
-{
- DEBUG_MSG(KERN_DEBUG "via_set_secondary_address(0x%08X)\n", addr);
- /* secondary display supports only quadword aligned memory */
- via_write_reg_mask(VIACR, 0x62, (addr >> 2) & 0xFE, 0xFE);
- via_write_reg(VIACR, 0x63, (addr >> 10) & 0xFF);
- via_write_reg(VIACR, 0x64, (addr >> 18) & 0xFF);
- via_write_reg_mask(VIACR, 0xA3, (addr >> 26) & 0x07, 0x07);
-}
-
-void via_set_primary_pitch(u32 pitch)
-{
- DEBUG_MSG(KERN_DEBUG "via_set_primary_pitch(0x%08X)\n", pitch);
- /* spec does not say that first adapter skips 3 bits but old
- * code did it and seems to be reasonable in analogy to 2nd adapter
- */
- pitch = pitch >> 3;
- via_write_reg(VIACR, 0x13, pitch & 0xFF);
- via_write_reg_mask(VIACR, 0x35, (pitch >> (8 - 5)) & 0xE0, 0xE0);
-}
-
-void via_set_secondary_pitch(u32 pitch)
-{
- DEBUG_MSG(KERN_DEBUG "via_set_secondary_pitch(0x%08X)\n", pitch);
- pitch = pitch >> 3;
- via_write_reg(VIACR, 0x66, pitch & 0xFF);
- via_write_reg_mask(VIACR, 0x67, (pitch >> 8) & 0x03, 0x03);
- via_write_reg_mask(VIACR, 0x71, (pitch >> (10 - 7)) & 0x80, 0x80);
-}
-
-void via_set_primary_color_depth(u8 depth)
-{
- u8 value;
-
- DEBUG_MSG(KERN_DEBUG "via_set_primary_color_depth(%d)\n", depth);
- switch (depth) {
- case 8:
- value = 0x00;
- break;
- case 15:
- value = 0x04;
- break;
- case 16:
- value = 0x14;
- break;
- case 24:
- value = 0x0C;
- break;
- case 30:
- value = 0x08;
- break;
- default:
- printk(KERN_WARNING "via_set_primary_color_depth: "
- "Unsupported depth: %d\n", depth);
- return;
- }
-
- via_write_reg_mask(VIASR, 0x15, value, 0x1C);
-}
-
-void via_set_secondary_color_depth(u8 depth)
-{
- u8 value;
-
- DEBUG_MSG(KERN_DEBUG "via_set_secondary_color_depth(%d)\n", depth);
- switch (depth) {
- case 8:
- value = 0x00;
- break;
- case 16:
- value = 0x40;
- break;
- case 24:
- value = 0xC0;
- break;
- case 30:
- value = 0x80;
- break;
- default:
- printk(KERN_WARNING "via_set_secondary_color_depth: "
- "Unsupported depth: %d\n", depth);
- return;
- }
-
- via_write_reg_mask(VIACR, 0x67, value, 0xC0);
-}
diff --git a/drivers/video/via/via_modesetting.h b/drivers/video/via/via_modesetting.h
deleted file mode 100644
index f6a6503da3b3..000000000000
--- a/drivers/video/via/via_modesetting.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
- * Copyright 2010 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-/*
- * basic modesetting functions
- */
-
-#ifndef __VIA_MODESETTING_H__
-#define __VIA_MODESETTING_H__
-
-#include <linux/types.h>
-
-
-#define VIA_PITCH_SIZE (1<<3)
-#define VIA_PITCH_MAX 0x3FF8
-
-
-struct via_display_timing {
- u16 hor_total;
- u16 hor_addr;
- u16 hor_blank_start;
- u16 hor_blank_end;
- u16 hor_sync_start;
- u16 hor_sync_end;
- u16 ver_total;
- u16 ver_addr;
- u16 ver_blank_start;
- u16 ver_blank_end;
- u16 ver_sync_start;
- u16 ver_sync_end;
-};
-
-
-void via_set_primary_timing(const struct via_display_timing *timing);
-void via_set_secondary_timing(const struct via_display_timing *timing);
-void via_set_primary_address(u32 addr);
-void via_set_secondary_address(u32 addr);
-void via_set_primary_pitch(u32 pitch);
-void via_set_secondary_pitch(u32 pitch);
-void via_set_primary_color_depth(u8 depth);
-void via_set_secondary_color_depth(u8 depth);
-
-#endif /* __VIA_MODESETTING_H__ */
diff --git a/drivers/video/via/via_utility.c b/drivers/video/via/via_utility.c
deleted file mode 100644
index 35458a5eadc8..000000000000
--- a/drivers/video/via/via_utility.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <linux/via-core.h>
-#include "global.h"
-
-void viafb_get_device_support_state(u32 *support_state)
-{
- *support_state = CRT_Device;
-
- if (viaparinfo->chip_info->tmds_chip_info.tmds_chip_name == VT1632_TMDS)
- *support_state |= DVI_Device;
-
- if (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name == VT1631_LVDS)
- *support_state |= LCD_Device;
-}
-
-void viafb_get_device_connect_state(u32 *connect_state)
-{
- bool mobile = false;
-
- *connect_state = CRT_Device;
-
- if (viafb_dvi_sense())
- *connect_state |= DVI_Device;
-
- viafb_lcd_get_mobile_state(&mobile);
- if (mobile)
- *connect_state |= LCD_Device;
-}
-
-bool viafb_lcd_get_support_expand_state(u32 xres, u32 yres)
-{
- unsigned int support_state = 0;
-
- switch (viafb_lcd_panel_id) {
- case LCD_PANEL_ID0_640X480:
- if ((xres < 640) && (yres < 480))
- support_state = true;
- break;
-
- case LCD_PANEL_ID1_800X600:
- if ((xres < 800) && (yres < 600))
- support_state = true;
- break;
-
- case LCD_PANEL_ID2_1024X768:
- if ((xres < 1024) && (yres < 768))
- support_state = true;
- break;
-
- case LCD_PANEL_ID3_1280X768:
- if ((xres < 1280) && (yres < 768))
- support_state = true;
- break;
-
- case LCD_PANEL_ID4_1280X1024:
- if ((xres < 1280) && (yres < 1024))
- support_state = true;
- break;
-
- case LCD_PANEL_ID5_1400X1050:
- if ((xres < 1400) && (yres < 1050))
- support_state = true;
- break;
-
- case LCD_PANEL_ID6_1600X1200:
- if ((xres < 1600) && (yres < 1200))
- support_state = true;
- break;
-
- case LCD_PANEL_ID7_1366X768:
- if ((xres < 1366) && (yres < 768))
- support_state = true;
- break;
-
- case LCD_PANEL_ID8_1024X600:
- if ((xres < 1024) && (yres < 600))
- support_state = true;
- break;
-
- case LCD_PANEL_ID9_1280X800:
- if ((xres < 1280) && (yres < 800))
- support_state = true;
- break;
-
- case LCD_PANEL_IDA_800X480:
- if ((xres < 800) && (yres < 480))
- support_state = true;
- break;
-
- case LCD_PANEL_IDB_1360X768:
- if ((xres < 1360) && (yres < 768))
- support_state = true;
- break;
-
- case LCD_PANEL_IDC_480X640:
- if ((xres < 480) && (yres < 640))
- support_state = true;
- break;
-
- default:
- support_state = false;
- break;
- }
-
- return support_state;
-}
-
-/*====================================================================*/
-/* Gamma Function Implementation*/
-/*====================================================================*/
-
-void viafb_set_gamma_table(int bpp, unsigned int *gamma_table)
-{
- int i, sr1a;
- int active_device_amount = 0;
- int device_status = viafb_DeviceStatus;
-
- for (i = 0; i < sizeof(viafb_DeviceStatus) * 8; i++) {
- if (device_status & 1)
- active_device_amount++;
- device_status >>= 1;
- }
-
- /* 8 bpp mode can't adjust gamma */
- if (bpp == 8)
- return ;
-
- /* Enable Gamma */
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_CLE266:
- case UNICHROME_K400:
- viafb_write_reg_mask(SR16, VIASR, 0x80, BIT7);
- break;
-
- case UNICHROME_K800:
- case UNICHROME_PM800:
- case UNICHROME_CN700:
- case UNICHROME_CX700:
- case UNICHROME_K8M890:
- case UNICHROME_P4M890:
- case UNICHROME_P4M900:
- viafb_write_reg_mask(CR33, VIACR, 0x80, BIT7);
- break;
- }
- sr1a = (unsigned int)viafb_read_reg(VIASR, SR1A);
- viafb_write_reg_mask(SR1A, VIASR, 0x0, BIT0);
-
- /* Fill IGA1 Gamma Table */
- outb(0, LUT_INDEX_WRITE);
- for (i = 0; i < 256; i++) {
- outb(gamma_table[i] >> 16, LUT_DATA);
- outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA);
- outb(gamma_table[i] & 0xFF, LUT_DATA);
- }
-
- /* If adjust Gamma value in SAMM, fill IGA1,
- IGA2 Gamma table simultaneous. */
- /* Switch to IGA2 Gamma Table */
- if ((active_device_amount > 1) &&
- !((viaparinfo->chip_info->gfx_chip_name ==
- UNICHROME_CLE266) &&
- (viaparinfo->chip_info->gfx_chip_revision < 15))) {
- viafb_write_reg_mask(SR1A, VIASR, 0x01, BIT0);
- viafb_write_reg_mask(CR6A, VIACR, 0x02, BIT1);
-
- /* Fill IGA2 Gamma Table */
- outb(0, LUT_INDEX_WRITE);
- for (i = 0; i < 256; i++) {
- outb(gamma_table[i] >> 16, LUT_DATA);
- outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA);
- outb(gamma_table[i] & 0xFF, LUT_DATA);
- }
- }
- viafb_write_reg(SR1A, VIASR, sr1a);
-}
-
-void viafb_get_gamma_table(unsigned int *gamma_table)
-{
- unsigned char color_r, color_g, color_b;
- unsigned char sr1a = 0;
- int i;
-
- /* Enable Gamma */
- switch (viaparinfo->chip_info->gfx_chip_name) {
- case UNICHROME_CLE266:
- case UNICHROME_K400:
- viafb_write_reg_mask(SR16, VIASR, 0x80, BIT7);
- break;
-
- case UNICHROME_K800:
- case UNICHROME_PM800:
- case UNICHROME_CN700:
- case UNICHROME_CX700:
- case UNICHROME_K8M890:
- case UNICHROME_P4M890:
- case UNICHROME_P4M900:
- viafb_write_reg_mask(CR33, VIACR, 0x80, BIT7);
- break;
- }
- sr1a = viafb_read_reg(VIASR, SR1A);
- viafb_write_reg_mask(SR1A, VIASR, 0x0, BIT0);
-
- /* Reading gamma table to get color value */
- outb(0, LUT_INDEX_READ);
- for (i = 0; i < 256; i++) {
- color_r = inb(LUT_DATA);
- color_g = inb(LUT_DATA);
- color_b = inb(LUT_DATA);
- gamma_table[i] =
- ((((u32) color_r) << 16) |
- (((u16) color_g) << 8)) | color_b;
- }
- viafb_write_reg(SR1A, VIASR, sr1a);
-}
-
-void viafb_get_gamma_support_state(int bpp, unsigned int *support_state)
-{
- if (bpp == 8)
- *support_state = None_Device;
- else
- *support_state = CRT_Device | DVI_Device | LCD_Device;
-}
diff --git a/drivers/video/via/via_utility.h b/drivers/video/via/via_utility.h
deleted file mode 100644
index f23be1708c14..000000000000
--- a/drivers/video/via/via_utility.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-#ifndef __VIAUTILITY_H__
-#define __VIAUTILITY_H__
-
-/* These functions are used to get information about device's state */
-void viafb_get_device_support_state(u32 *support_state);
-void viafb_get_device_connect_state(u32 *connect_state);
-bool viafb_lcd_get_support_expand_state(u32 xres, u32 yres);
-
-/* These function are used to access gamma table */
-void viafb_set_gamma_table(int bpp, unsigned int *gamma_table);
-void viafb_get_gamma_table(unsigned int *gamma_table);
-void viafb_get_gamma_support_state(int bpp, unsigned int *support_state);
-
-#endif /* __VIAUTILITY_H__ */
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
deleted file mode 100644
index 325c43c6ff97..000000000000
--- a/drivers/video/via/viafbdev.c
+++ /dev/null
@@ -1,2176 +0,0 @@
-/*
- * Copyright 1998-2009 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <linux/module.h>
-#include <linux/seq_file.h>
-#include <linux/slab.h>
-#include <linux/stat.h>
-#include <linux/via-core.h>
-#include <linux/via_i2c.h>
-#include <asm/olpc.h>
-
-#define _MASTER_FILE
-#include "global.h"
-
-static char *viafb_name = "Via";
-static u32 pseudo_pal[17];
-
-/* video mode */
-static char *viafb_mode;
-static char *viafb_mode1;
-static int viafb_bpp = 32;
-static int viafb_bpp1 = 32;
-
-static unsigned int viafb_second_offset;
-static int viafb_second_size;
-
-static int viafb_accel = 1;
-
-/* Added for specifying active devices.*/
-static char *viafb_active_dev;
-
-/*Added for specify lcd output port*/
-static char *viafb_lcd_port = "";
-static char *viafb_dvi_port = "";
-
-static void retrieve_device_setting(struct viafb_ioctl_setting
- *setting_info);
-static int viafb_pan_display(struct fb_var_screeninfo *var,
- struct fb_info *info);
-
-static struct fb_ops viafb_ops;
-
-/* supported output devices on each IGP
- * only CX700, VX800, VX855, VX900 were documented
- * VIA_CRT should be everywhere
- * VIA_6C can be onle pre-CX700 (probably only on CLE266) as 6C is used for PLL
- * source selection on CX700 and later
- * K400 seems to support VIA_96, VIA_DVP1, VIA_LVDS{1,2} as in viamode.c
- */
-static const u32 supported_odev_map[] = {
- [UNICHROME_CLE266] = VIA_CRT | VIA_LDVP0 | VIA_LDVP1,
- [UNICHROME_K400] = VIA_CRT | VIA_DVP0 | VIA_DVP1 | VIA_LVDS1
- | VIA_LVDS2,
- [UNICHROME_K800] = VIA_CRT | VIA_DVP0 | VIA_DVP1 | VIA_LVDS1
- | VIA_LVDS2,
- [UNICHROME_PM800] = VIA_CRT | VIA_DVP0 | VIA_DVP1 | VIA_LVDS1
- | VIA_LVDS2,
- [UNICHROME_CN700] = VIA_CRT | VIA_DVP0 | VIA_DVP1 | VIA_LVDS1
- | VIA_LVDS2,
- [UNICHROME_CX700] = VIA_CRT | VIA_DVP1 | VIA_LVDS1 | VIA_LVDS2,
- [UNICHROME_CN750] = VIA_CRT | VIA_DVP1 | VIA_LVDS1 | VIA_LVDS2,
- [UNICHROME_K8M890] = VIA_CRT | VIA_DVP1 | VIA_LVDS1 | VIA_LVDS2,
- [UNICHROME_P4M890] = VIA_CRT | VIA_DVP1 | VIA_LVDS1 | VIA_LVDS2,
- [UNICHROME_P4M900] = VIA_CRT | VIA_DVP1 | VIA_LVDS1 | VIA_LVDS2,
- [UNICHROME_VX800] = VIA_CRT | VIA_DVP1 | VIA_LVDS1 | VIA_LVDS2,
- [UNICHROME_VX855] = VIA_CRT | VIA_DVP1 | VIA_LVDS1 | VIA_LVDS2,
- [UNICHROME_VX900] = VIA_CRT | VIA_DVP1 | VIA_LVDS1 | VIA_LVDS2,
-};
-
-static void viafb_fill_var_color_info(struct fb_var_screeninfo *var, u8 depth)
-{
- var->grayscale = 0;
- var->red.msb_right = 0;
- var->green.msb_right = 0;
- var->blue.msb_right = 0;
- var->transp.offset = 0;
- var->transp.length = 0;
- var->transp.msb_right = 0;
- var->nonstd = 0;
- switch (depth) {
- case 8:
- var->bits_per_pixel = 8;
- var->red.offset = 0;
- var->green.offset = 0;
- var->blue.offset = 0;
- var->red.length = 8;
- var->green.length = 8;
- var->blue.length = 8;
- break;
- case 15:
- var->bits_per_pixel = 16;
- var->red.offset = 10;
- var->green.offset = 5;
- var->blue.offset = 0;
- var->red.length = 5;
- var->green.length = 5;
- var->blue.length = 5;
- break;
- case 16:
- var->bits_per_pixel = 16;
- var->red.offset = 11;
- var->green.offset = 5;
- var->blue.offset = 0;
- var->red.length = 5;
- var->green.length = 6;
- var->blue.length = 5;
- break;
- case 24:
- var->bits_per_pixel = 32;
- var->red.offset = 16;
- var->green.offset = 8;
- var->blue.offset = 0;
- var->red.length = 8;
- var->green.length = 8;
- var->blue.length = 8;
- break;
- case 30:
- var->bits_per_pixel = 32;
- var->red.offset = 20;
- var->green.offset = 10;
- var->blue.offset = 0;
- var->red.length = 10;
- var->green.length = 10;
- var->blue.length = 10;
- break;
- }
-}
-
-static void viafb_update_fix(struct fb_info *info)
-{
- u32 bpp = info->var.bits_per_pixel;
-
- info->fix.visual =
- bpp == 8 ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
- info->fix.line_length = ALIGN(info->var.xres_virtual * bpp / 8,
- VIA_PITCH_SIZE);
-}
-
-static void viafb_setup_fixinfo(struct fb_fix_screeninfo *fix,
- struct viafb_par *viaparinfo)
-{
- memset(fix, 0, sizeof(struct fb_fix_screeninfo));
- strcpy(fix->id, viafb_name);
-
- fix->smem_start = viaparinfo->fbmem;
- fix->smem_len = viaparinfo->fbmem_free;
-
- fix->type = FB_TYPE_PACKED_PIXELS;
- fix->type_aux = 0;
- fix->visual = FB_VISUAL_TRUECOLOR;
-
- fix->xpanstep = fix->ywrapstep = 0;
- fix->ypanstep = 1;
-
- /* Just tell the accel name */
- viafbinfo->fix.accel = FB_ACCEL_VIA_UNICHROME;
-}
-static int viafb_open(struct fb_info *info, int user)
-{
- DEBUG_MSG(KERN_INFO "viafb_open!\n");
- return 0;
-}
-
-static int viafb_release(struct fb_info *info, int user)
-{
- DEBUG_MSG(KERN_INFO "viafb_release!\n");
- return 0;
-}
-
-static inline int get_var_refresh(struct fb_var_screeninfo *var)
-{
- u32 htotal, vtotal;
-
- htotal = var->left_margin + var->xres + var->right_margin
- + var->hsync_len;
- vtotal = var->upper_margin + var->yres + var->lower_margin
- + var->vsync_len;
- return PICOS2KHZ(var->pixclock) * 1000 / (htotal * vtotal);
-}
-
-static int viafb_check_var(struct fb_var_screeninfo *var,
- struct fb_info *info)
-{
- int depth, refresh;
- struct viafb_par *ppar = info->par;
- u32 line;
-
- DEBUG_MSG(KERN_INFO "viafb_check_var!\n");
- /* Sanity check */
- /* HW neither support interlacte nor double-scaned mode */
- if (var->vmode & FB_VMODE_INTERLACED || var->vmode & FB_VMODE_DOUBLE)
- return -EINVAL;
-
- /* the refresh rate is not important here, as we only want to know
- * whether the resolution exists
- */
- if (!viafb_get_best_mode(var->xres, var->yres, 60)) {
- DEBUG_MSG(KERN_INFO
- "viafb: Mode %dx%dx%d not supported!!\n",
- var->xres, var->yres, var->bits_per_pixel);
- return -EINVAL;
- }
-
- depth = fb_get_color_depth(var, &info->fix);
- if (!depth)
- depth = var->bits_per_pixel;
-
- if (depth < 0 || depth > 32)
- return -EINVAL;
- else if (!depth)
- depth = 24;
- else if (depth == 15 && viafb_dual_fb && ppar->iga_path == IGA1)
- depth = 15;
- else if (depth == 30)
- depth = 30;
- else if (depth <= 8)
- depth = 8;
- else if (depth <= 16)
- depth = 16;
- else
- depth = 24;
-
- viafb_fill_var_color_info(var, depth);
- if (var->xres_virtual < var->xres)
- var->xres_virtual = var->xres;
-
- line = ALIGN(var->xres_virtual * var->bits_per_pixel / 8,
- VIA_PITCH_SIZE);
- if (line > VIA_PITCH_MAX || line * var->yres_virtual > ppar->memsize)
- return -EINVAL;
-
- /* Based on var passed in to calculate the refresh,
- * because our driver use some modes special.
- */
- refresh = viafb_get_refresh(var->xres, var->yres,
- get_var_refresh(var));
-
- /* Adjust var according to our driver's own table */
- viafb_fill_var_timing_info(var,
- viafb_get_best_mode(var->xres, var->yres, refresh));
- if (var->accel_flags & FB_ACCELF_TEXT &&
- !ppar->shared->vdev->engine_mmio)
- var->accel_flags = 0;
-
- return 0;
-}
-
-static int viafb_set_par(struct fb_info *info)
-{
- struct viafb_par *viapar = info->par;
- int refresh;
- DEBUG_MSG(KERN_INFO "viafb_set_par!\n");
-
- viafb_update_fix(info);
- viapar->depth = fb_get_color_depth(&info->var, &info->fix);
- viafb_update_device_setting(viafbinfo->var.xres, viafbinfo->var.yres,
- viafbinfo->var.bits_per_pixel, 0);
-
- if (viafb_dual_fb) {
- viafb_update_device_setting(viafbinfo1->var.xres,
- viafbinfo1->var.yres, viafbinfo1->var.bits_per_pixel,
- 1);
- } else if (viafb_SAMM_ON == 1) {
- DEBUG_MSG(KERN_INFO
- "viafb_second_xres = %d, viafb_second_yres = %d, bpp = %d\n",
- viafb_second_xres, viafb_second_yres, viafb_bpp1);
-
- viafb_update_device_setting(viafb_second_xres,
- viafb_second_yres, viafb_bpp1, 1);
- }
-
- refresh = get_var_refresh(&info->var);
- if (viafb_dual_fb && viapar->iga_path == IGA2) {
- viafb_bpp1 = info->var.bits_per_pixel;
- viafb_refresh1 = refresh;
- } else {
- viafb_bpp = info->var.bits_per_pixel;
- viafb_refresh = refresh;
- }
-
- if (info->var.accel_flags & FB_ACCELF_TEXT)
- info->flags &= ~FBINFO_HWACCEL_DISABLED;
- else
- info->flags |= FBINFO_HWACCEL_DISABLED;
- viafb_setmode();
- viafb_pan_display(&info->var, info);
-
- return 0;
-}
-
-/* Set one color register */
-static int viafb_setcolreg(unsigned regno, unsigned red, unsigned green,
-unsigned blue, unsigned transp, struct fb_info *info)
-{
- struct viafb_par *viapar = info->par;
- u32 r, g, b;
-
- if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR) {
- if (regno > 255)
- return -EINVAL;
-
- if (!viafb_dual_fb || viapar->iga_path == IGA1)
- viafb_set_primary_color_register(regno, red >> 8,
- green >> 8, blue >> 8);
-
- if (!viafb_dual_fb || viapar->iga_path == IGA2)
- viafb_set_secondary_color_register(regno, red >> 8,
- green >> 8, blue >> 8);
- } else {
- if (regno > 15)
- return -EINVAL;
-
- r = (red >> (16 - info->var.red.length))
- << info->var.red.offset;
- b = (blue >> (16 - info->var.blue.length))
- << info->var.blue.offset;
- g = (green >> (16 - info->var.green.length))
- << info->var.green.offset;
- ((u32 *) info->pseudo_palette)[regno] = r | g | b;
- }
-
- return 0;
-}
-
-static int viafb_pan_display(struct fb_var_screeninfo *var,
- struct fb_info *info)
-{
- struct viafb_par *viapar = info->par;
- u32 vram_addr = viapar->vram_addr
- + var->yoffset * info->fix.line_length
- + var->xoffset * info->var.bits_per_pixel / 8;
-
- DEBUG_MSG(KERN_DEBUG "viafb_pan_display, address = %d\n", vram_addr);
- if (!viafb_dual_fb) {
- via_set_primary_address(vram_addr);
- via_set_secondary_address(vram_addr);
- } else if (viapar->iga_path == IGA1)
- via_set_primary_address(vram_addr);
- else
- via_set_secondary_address(vram_addr);
-
- return 0;
-}
-
-static int viafb_blank(int blank_mode, struct fb_info *info)
-{
- DEBUG_MSG(KERN_INFO "viafb_blank!\n");
- /* clear DPMS setting */
-
- switch (blank_mode) {
- case FB_BLANK_UNBLANK:
- /* Screen: On, HSync: On, VSync: On */
- /* control CRT monitor power management */
- via_set_state(VIA_CRT, VIA_STATE_ON);
- break;
- case FB_BLANK_HSYNC_SUSPEND:
- /* Screen: Off, HSync: Off, VSync: On */
- /* control CRT monitor power management */
- via_set_state(VIA_CRT, VIA_STATE_STANDBY);
- break;
- case FB_BLANK_VSYNC_SUSPEND:
- /* Screen: Off, HSync: On, VSync: Off */
- /* control CRT monitor power management */
- via_set_state(VIA_CRT, VIA_STATE_SUSPEND);
- break;
- case FB_BLANK_POWERDOWN:
- /* Screen: Off, HSync: Off, VSync: Off */
- /* control CRT monitor power management */
- via_set_state(VIA_CRT, VIA_STATE_OFF);
- break;
- }
-
- return 0;
-}
-
-static int viafb_ioctl(struct fb_info *info, u_int cmd, u_long arg)
-{
- union {
- struct viafb_ioctl_mode viamode;
- struct viafb_ioctl_samm viasamm;
- struct viafb_driver_version driver_version;
- struct fb_var_screeninfo sec_var;
- struct _panel_size_pos_info panel_pos_size_para;
- struct viafb_ioctl_setting viafb_setting;
- struct device_t active_dev;
- } u;
- u32 state_info = 0;
- u32 *viafb_gamma_table;
- char driver_name[] = "viafb";
-
- u32 __user *argp = (u32 __user *) arg;
- u32 gpu32;
-
- DEBUG_MSG(KERN_INFO "viafb_ioctl: 0x%X !!\n", cmd);
- printk(KERN_WARNING "viafb_ioctl: Please avoid this interface as it is unstable and might change or vanish at any time!\n");
- memset(&u, 0, sizeof(u));
-
- switch (cmd) {
- case VIAFB_GET_CHIP_INFO:
- if (copy_to_user(argp, viaparinfo->chip_info,
- sizeof(struct chip_information)))
- return -EFAULT;
- break;
- case VIAFB_GET_INFO_SIZE:
- return put_user((u32)sizeof(struct viafb_ioctl_info), argp);
- case VIAFB_GET_INFO:
- return viafb_ioctl_get_viafb_info(arg);
- case VIAFB_HOTPLUG:
- return put_user(viafb_ioctl_hotplug(info->var.xres,
- info->var.yres,
- info->var.bits_per_pixel), argp);
- case VIAFB_SET_HOTPLUG_FLAG:
- if (copy_from_user(&gpu32, argp, sizeof(gpu32)))
- return -EFAULT;
- viafb_hotplug = (gpu32) ? 1 : 0;
- break;
- case VIAFB_GET_RESOLUTION:
- u.viamode.xres = (u32) viafb_hotplug_Xres;
- u.viamode.yres = (u32) viafb_hotplug_Yres;
- u.viamode.refresh = (u32) viafb_hotplug_refresh;
- u.viamode.bpp = (u32) viafb_hotplug_bpp;
- if (viafb_SAMM_ON == 1) {
- u.viamode.xres_sec = viafb_second_xres;
- u.viamode.yres_sec = viafb_second_yres;
- u.viamode.virtual_xres_sec = viafb_dual_fb ? viafbinfo1->var.xres_virtual : viafbinfo->var.xres_virtual;
- u.viamode.virtual_yres_sec = viafb_dual_fb ? viafbinfo1->var.yres_virtual : viafbinfo->var.yres_virtual;
- u.viamode.refresh_sec = viafb_refresh1;
- u.viamode.bpp_sec = viafb_bpp1;
- } else {
- u.viamode.xres_sec = 0;
- u.viamode.yres_sec = 0;
- u.viamode.virtual_xres_sec = 0;
- u.viamode.virtual_yres_sec = 0;
- u.viamode.refresh_sec = 0;
- u.viamode.bpp_sec = 0;
- }
- if (copy_to_user(argp, &u.viamode, sizeof(u.viamode)))
- return -EFAULT;
- break;
- case VIAFB_GET_SAMM_INFO:
- u.viasamm.samm_status = viafb_SAMM_ON;
-
- if (viafb_SAMM_ON == 1) {
- if (viafb_dual_fb) {
- u.viasamm.size_prim = viaparinfo->fbmem_free;
- u.viasamm.size_sec = viaparinfo1->fbmem_free;
- } else {
- if (viafb_second_size) {
- u.viasamm.size_prim =
- viaparinfo->fbmem_free -
- viafb_second_size * 1024 * 1024;
- u.viasamm.size_sec =
- viafb_second_size * 1024 * 1024;
- } else {
- u.viasamm.size_prim =
- viaparinfo->fbmem_free >> 1;
- u.viasamm.size_sec =
- (viaparinfo->fbmem_free >> 1);
- }
- }
- u.viasamm.mem_base = viaparinfo->fbmem;
- u.viasamm.offset_sec = viafb_second_offset;
- } else {
- u.viasamm.size_prim =
- viaparinfo->memsize - viaparinfo->fbmem_used;
- u.viasamm.size_sec = 0;
- u.viasamm.mem_base = viaparinfo->fbmem;
- u.viasamm.offset_sec = 0;
- }
-
- if (copy_to_user(argp, &u.viasamm, sizeof(u.viasamm)))
- return -EFAULT;
-
- break;
- case VIAFB_TURN_ON_OUTPUT_DEVICE:
- if (copy_from_user(&gpu32, argp, sizeof(gpu32)))
- return -EFAULT;
- if (gpu32 & CRT_Device)
- via_set_state(VIA_CRT, VIA_STATE_ON);
- if (gpu32 & DVI_Device)
- viafb_dvi_enable();
- if (gpu32 & LCD_Device)
- viafb_lcd_enable();
- break;
- case VIAFB_TURN_OFF_OUTPUT_DEVICE:
- if (copy_from_user(&gpu32, argp, sizeof(gpu32)))
- return -EFAULT;
- if (gpu32 & CRT_Device)
- via_set_state(VIA_CRT, VIA_STATE_OFF);
- if (gpu32 & DVI_Device)
- viafb_dvi_disable();
- if (gpu32 & LCD_Device)
- viafb_lcd_disable();
- break;
- case VIAFB_GET_DEVICE:
- u.active_dev.crt = viafb_CRT_ON;
- u.active_dev.dvi = viafb_DVI_ON;
- u.active_dev.lcd = viafb_LCD_ON;
- u.active_dev.samm = viafb_SAMM_ON;
- u.active_dev.primary_dev = viafb_primary_dev;
-
- u.active_dev.lcd_dsp_cent = viafb_lcd_dsp_method;
- u.active_dev.lcd_panel_id = viafb_lcd_panel_id;
- u.active_dev.lcd_mode = viafb_lcd_mode;
-
- u.active_dev.xres = viafb_hotplug_Xres;
- u.active_dev.yres = viafb_hotplug_Yres;
-
- u.active_dev.xres1 = viafb_second_xres;
- u.active_dev.yres1 = viafb_second_yres;
-
- u.active_dev.bpp = viafb_bpp;
- u.active_dev.bpp1 = viafb_bpp1;
- u.active_dev.refresh = viafb_refresh;
- u.active_dev.refresh1 = viafb_refresh1;
-
- u.active_dev.epia_dvi = viafb_platform_epia_dvi;
- u.active_dev.lcd_dual_edge = viafb_device_lcd_dualedge;
- u.active_dev.bus_width = viafb_bus_width;
-
- if (copy_to_user(argp, &u.active_dev, sizeof(u.active_dev)))
- return -EFAULT;
- break;
-
- case VIAFB_GET_DRIVER_VERSION:
- u.driver_version.iMajorNum = VERSION_MAJOR;
- u.driver_version.iKernelNum = VERSION_KERNEL;
- u.driver_version.iOSNum = VERSION_OS;
- u.driver_version.iMinorNum = VERSION_MINOR;
-
- if (copy_to_user(argp, &u.driver_version,
- sizeof(u.driver_version)))
- return -EFAULT;
-
- break;
-
- case VIAFB_GET_DEVICE_INFO:
-
- retrieve_device_setting(&u.viafb_setting);
-
- if (copy_to_user(argp, &u.viafb_setting,
- sizeof(u.viafb_setting)))
- return -EFAULT;
-
- break;
-
- case VIAFB_GET_DEVICE_SUPPORT:
- viafb_get_device_support_state(&state_info);
- if (put_user(state_info, argp))
- return -EFAULT;
- break;
-
- case VIAFB_GET_DEVICE_CONNECT:
- viafb_get_device_connect_state(&state_info);
- if (put_user(state_info, argp))
- return -EFAULT;
- break;
-
- case VIAFB_GET_PANEL_SUPPORT_EXPAND:
- state_info =
- viafb_lcd_get_support_expand_state(info->var.xres,
- info->var.yres);
- if (put_user(state_info, argp))
- return -EFAULT;
- break;
-
- case VIAFB_GET_DRIVER_NAME:
- if (copy_to_user(argp, driver_name, sizeof(driver_name)))
- return -EFAULT;
- break;
-
- case VIAFB_SET_GAMMA_LUT:
- viafb_gamma_table = memdup_user(argp, 256 * sizeof(u32));
- if (IS_ERR(viafb_gamma_table))
- return PTR_ERR(viafb_gamma_table);
- viafb_set_gamma_table(viafb_bpp, viafb_gamma_table);
- kfree(viafb_gamma_table);
- break;
-
- case VIAFB_GET_GAMMA_LUT:
- viafb_gamma_table = kmalloc(256 * sizeof(u32), GFP_KERNEL);
- if (!viafb_gamma_table)
- return -ENOMEM;
- viafb_get_gamma_table(viafb_gamma_table);
- if (copy_to_user(argp, viafb_gamma_table,
- 256 * sizeof(u32))) {
- kfree(viafb_gamma_table);
- return -EFAULT;
- }
- kfree(viafb_gamma_table);
- break;
-
- case VIAFB_GET_GAMMA_SUPPORT_STATE:
- viafb_get_gamma_support_state(viafb_bpp, &state_info);
- if (put_user(state_info, argp))
- return -EFAULT;
- break;
- case VIAFB_SYNC_SURFACE:
- DEBUG_MSG(KERN_INFO "lobo VIAFB_SYNC_SURFACE\n");
- break;
- case VIAFB_GET_DRIVER_CAPS:
- break;
-
- case VIAFB_GET_PANEL_MAX_SIZE:
- if (copy_from_user(&u.panel_pos_size_para, argp,
- sizeof(u.panel_pos_size_para)))
- return -EFAULT;
- u.panel_pos_size_para.x = u.panel_pos_size_para.y = 0;
- if (copy_to_user(argp, &u.panel_pos_size_para,
- sizeof(u.panel_pos_size_para)))
- return -EFAULT;
- break;
- case VIAFB_GET_PANEL_MAX_POSITION:
- if (copy_from_user(&u.panel_pos_size_para, argp,
- sizeof(u.panel_pos_size_para)))
- return -EFAULT;
- u.panel_pos_size_para.x = u.panel_pos_size_para.y = 0;
- if (copy_to_user(argp, &u.panel_pos_size_para,
- sizeof(u.panel_pos_size_para)))
- return -EFAULT;
- break;
-
- case VIAFB_GET_PANEL_POSITION:
- if (copy_from_user(&u.panel_pos_size_para, argp,
- sizeof(u.panel_pos_size_para)))
- return -EFAULT;
- u.panel_pos_size_para.x = u.panel_pos_size_para.y = 0;
- if (copy_to_user(argp, &u.panel_pos_size_para,
- sizeof(u.panel_pos_size_para)))
- return -EFAULT;
- break;
- case VIAFB_GET_PANEL_SIZE:
- if (copy_from_user(&u.panel_pos_size_para, argp,
- sizeof(u.panel_pos_size_para)))
- return -EFAULT;
- u.panel_pos_size_para.x = u.panel_pos_size_para.y = 0;
- if (copy_to_user(argp, &u.panel_pos_size_para,
- sizeof(u.panel_pos_size_para)))
- return -EFAULT;
- break;
-
- case VIAFB_SET_PANEL_POSITION:
- if (copy_from_user(&u.panel_pos_size_para, argp,
- sizeof(u.panel_pos_size_para)))
- return -EFAULT;
- break;
- case VIAFB_SET_PANEL_SIZE:
- if (copy_from_user(&u.panel_pos_size_para, argp,
- sizeof(u.panel_pos_size_para)))
- return -EFAULT;
- break;
-
- default:
- return -EINVAL;
- }
-
- return 0;
-}
-
-static void viafb_fillrect(struct fb_info *info,
- const struct fb_fillrect *rect)
-{
- struct viafb_par *viapar = info->par;
- struct viafb_shared *shared = viapar->shared;
- u32 fg_color;
- u8 rop;
-
- if (info->flags & FBINFO_HWACCEL_DISABLED || !shared->hw_bitblt) {
- cfb_fillrect(info, rect);
- return;
- }
-
- if (!rect->width || !rect->height)
- return;
-
- if (info->fix.visual == FB_VISUAL_TRUECOLOR)
- fg_color = ((u32 *)info->pseudo_palette)[rect->color];
- else
- fg_color = rect->color;
-
- if (rect->rop == ROP_XOR)
- rop = 0x5A;
- else
- rop = 0xF0;
-
- DEBUG_MSG(KERN_DEBUG "viafb 2D engine: fillrect\n");
- if (shared->hw_bitblt(shared->vdev->engine_mmio, VIA_BITBLT_FILL,
- rect->width, rect->height, info->var.bits_per_pixel,
- viapar->vram_addr, info->fix.line_length, rect->dx, rect->dy,
- NULL, 0, 0, 0, 0, fg_color, 0, rop))
- cfb_fillrect(info, rect);
-}
-
-static void viafb_copyarea(struct fb_info *info,
- const struct fb_copyarea *area)
-{
- struct viafb_par *viapar = info->par;
- struct viafb_shared *shared = viapar->shared;
-
- if (info->flags & FBINFO_HWACCEL_DISABLED || !shared->hw_bitblt) {
- cfb_copyarea(info, area);
- return;
- }
-
- if (!area->width || !area->height)
- return;
-
- DEBUG_MSG(KERN_DEBUG "viafb 2D engine: copyarea\n");
- if (shared->hw_bitblt(shared->vdev->engine_mmio, VIA_BITBLT_COLOR,
- area->width, area->height, info->var.bits_per_pixel,
- viapar->vram_addr, info->fix.line_length, area->dx, area->dy,
- NULL, viapar->vram_addr, info->fix.line_length,
- area->sx, area->sy, 0, 0, 0))
- cfb_copyarea(info, area);
-}
-
-static void viafb_imageblit(struct fb_info *info,
- const struct fb_image *image)
-{
- struct viafb_par *viapar = info->par;
- struct viafb_shared *shared = viapar->shared;
- u32 fg_color = 0, bg_color = 0;
- u8 op;
-
- if (info->flags & FBINFO_HWACCEL_DISABLED || !shared->hw_bitblt ||
- (image->depth != 1 && image->depth != viapar->depth)) {
- cfb_imageblit(info, image);
- return;
- }
-
- if (image->depth == 1) {
- op = VIA_BITBLT_MONO;
- if (info->fix.visual == FB_VISUAL_TRUECOLOR) {
- fg_color =
- ((u32 *)info->pseudo_palette)[image->fg_color];
- bg_color =
- ((u32 *)info->pseudo_palette)[image->bg_color];
- } else {
- fg_color = image->fg_color;
- bg_color = image->bg_color;
- }
- } else
- op = VIA_BITBLT_COLOR;
-
- DEBUG_MSG(KERN_DEBUG "viafb 2D engine: imageblit\n");
- if (shared->hw_bitblt(shared->vdev->engine_mmio, op,
- image->width, image->height, info->var.bits_per_pixel,
- viapar->vram_addr, info->fix.line_length, image->dx, image->dy,
- (u32 *)image->data, 0, 0, 0, 0, fg_color, bg_color, 0))
- cfb_imageblit(info, image);
-}
-
-static int viafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
-{
- struct viafb_par *viapar = info->par;
- void __iomem *engine = viapar->shared->vdev->engine_mmio;
- u32 temp, xx, yy, bg_color = 0, fg_color = 0,
- chip_name = viapar->shared->chip_info.gfx_chip_name;
- int i, j = 0, cur_size = 64;
-
- if (info->flags & FBINFO_HWACCEL_DISABLED || info != viafbinfo)
- return -ENODEV;
-
- /* LCD ouput does not support hw cursors (at least on VN896) */
- if ((chip_name == UNICHROME_CLE266 && viapar->iga_path == IGA2) ||
- viafb_LCD_ON)
- return -ENODEV;
-
- viafb_show_hw_cursor(info, HW_Cursor_OFF);
-
- if (cursor->set & FB_CUR_SETHOT) {
- temp = (cursor->hot.x << 16) + cursor->hot.y;
- writel(temp, engine + VIA_REG_CURSOR_ORG);
- }
-
- if (cursor->set & FB_CUR_SETPOS) {
- yy = cursor->image.dy - info->var.yoffset;
- xx = cursor->image.dx - info->var.xoffset;
- temp = yy & 0xFFFF;
- temp |= (xx << 16);
- writel(temp, engine + VIA_REG_CURSOR_POS);
- }
-
- if (cursor->image.width <= 32 && cursor->image.height <= 32)
- cur_size = 32;
- else if (cursor->image.width <= 64 && cursor->image.height <= 64)
- cur_size = 64;
- else {
- printk(KERN_WARNING "viafb_cursor: The cursor is too large "
- "%dx%d", cursor->image.width, cursor->image.height);
- return -ENXIO;
- }
-
- if (cursor->set & FB_CUR_SETSIZE) {
- temp = readl(engine + VIA_REG_CURSOR_MODE);
- if (cur_size == 32)
- temp |= 0x2;
- else
- temp &= ~0x2;
-
- writel(temp, engine + VIA_REG_CURSOR_MODE);
- }
-
- if (cursor->set & FB_CUR_SETCMAP) {
- fg_color = cursor->image.fg_color;
- bg_color = cursor->image.bg_color;
- if (chip_name == UNICHROME_CX700 ||
- chip_name == UNICHROME_VX800 ||
- chip_name == UNICHROME_VX855 ||
- chip_name == UNICHROME_VX900) {
- fg_color =
- ((info->cmap.red[fg_color] & 0xFFC0) << 14) |
- ((info->cmap.green[fg_color] & 0xFFC0) << 4) |
- ((info->cmap.blue[fg_color] & 0xFFC0) >> 6);
- bg_color =
- ((info->cmap.red[bg_color] & 0xFFC0) << 14) |
- ((info->cmap.green[bg_color] & 0xFFC0) << 4) |
- ((info->cmap.blue[bg_color] & 0xFFC0) >> 6);
- } else {
- fg_color =
- ((info->cmap.red[fg_color] & 0xFF00) << 8) |
- (info->cmap.green[fg_color] & 0xFF00) |
- ((info->cmap.blue[fg_color] & 0xFF00) >> 8);
- bg_color =
- ((info->cmap.red[bg_color] & 0xFF00) << 8) |
- (info->cmap.green[bg_color] & 0xFF00) |
- ((info->cmap.blue[bg_color] & 0xFF00) >> 8);
- }
-
- writel(bg_color, engine + VIA_REG_CURSOR_BG);
- writel(fg_color, engine + VIA_REG_CURSOR_FG);
- }
-
- if (cursor->set & FB_CUR_SETSHAPE) {
- struct {
- u8 data[CURSOR_SIZE];
- u32 bak[CURSOR_SIZE / 4];
- } *cr_data = kzalloc(sizeof(*cr_data), GFP_ATOMIC);
- int size = ((cursor->image.width + 7) >> 3) *
- cursor->image.height;
-
- if (!cr_data)
- return -ENOMEM;
-
- if (cur_size == 32) {
- for (i = 0; i < (CURSOR_SIZE / 4); i++) {
- cr_data->bak[i] = 0x0;
- cr_data->bak[i + 1] = 0xFFFFFFFF;
- i += 1;
- }
- } else {
- for (i = 0; i < (CURSOR_SIZE / 4); i++) {
- cr_data->bak[i] = 0x0;
- cr_data->bak[i + 1] = 0x0;
- cr_data->bak[i + 2] = 0xFFFFFFFF;
- cr_data->bak[i + 3] = 0xFFFFFFFF;
- i += 3;
- }
- }
-
- switch (cursor->rop) {
- case ROP_XOR:
- for (i = 0; i < size; i++)
- cr_data->data[i] = cursor->mask[i];
- break;
- case ROP_COPY:
-
- for (i = 0; i < size; i++)
- cr_data->data[i] = cursor->mask[i];
- break;
- default:
- break;
- }
-
- if (cur_size == 32) {
- for (i = 0; i < size; i++) {
- cr_data->bak[j] = (u32) cr_data->data[i];
- cr_data->bak[j + 1] = ~cr_data->bak[j];
- j += 2;
- }
- } else {
- for (i = 0; i < size; i++) {
- cr_data->bak[j] = (u32) cr_data->data[i];
- cr_data->bak[j + 1] = 0x0;
- cr_data->bak[j + 2] = ~cr_data->bak[j];
- cr_data->bak[j + 3] = ~cr_data->bak[j + 1];
- j += 4;
- }
- }
-
- memcpy_toio(viafbinfo->screen_base + viapar->shared->
- cursor_vram_addr, cr_data->bak, CURSOR_SIZE);
- kfree(cr_data);
- }
-
- if (cursor->enable)
- viafb_show_hw_cursor(info, HW_Cursor_ON);
-
- return 0;
-}
-
-static int viafb_sync(struct fb_info *info)
-{
- if (!(info->flags & FBINFO_HWACCEL_DISABLED))
- viafb_wait_engine_idle(info);
- return 0;
-}
-
-static int get_primary_device(void)
-{
- int primary_device = 0;
- /* Rule: device on iga1 path are the primary device. */
- if (viafb_SAMM_ON) {
- if (viafb_CRT_ON) {
- if (viaparinfo->shared->iga1_devices & VIA_CRT) {
- DEBUG_MSG(KERN_INFO "CRT IGA Path:%d\n", IGA1);
- primary_device = CRT_Device;
- }
- }
- if (viafb_DVI_ON) {
- if (viaparinfo->tmds_setting_info->iga_path == IGA1) {
- DEBUG_MSG(KERN_INFO "DVI IGA Path:%d\n",
- viaparinfo->
- tmds_setting_info->iga_path);
- primary_device = DVI_Device;
- }
- }
- if (viafb_LCD_ON) {
- if (viaparinfo->lvds_setting_info->iga_path == IGA1) {
- DEBUG_MSG(KERN_INFO "LCD IGA Path:%d\n",
- viaparinfo->
- lvds_setting_info->iga_path);
- primary_device = LCD_Device;
- }
- }
- if (viafb_LCD2_ON) {
- if (viaparinfo->lvds_setting_info2->iga_path == IGA1) {
- DEBUG_MSG(KERN_INFO "LCD2 IGA Path:%d\n",
- viaparinfo->
- lvds_setting_info2->iga_path);
- primary_device = LCD2_Device;
- }
- }
- }
- return primary_device;
-}
-
-static void retrieve_device_setting(struct viafb_ioctl_setting
- *setting_info)
-{
-
- /* get device status */
- if (viafb_CRT_ON == 1)
- setting_info->device_status = CRT_Device;
- if (viafb_DVI_ON == 1)
- setting_info->device_status |= DVI_Device;
- if (viafb_LCD_ON == 1)
- setting_info->device_status |= LCD_Device;
- if (viafb_LCD2_ON == 1)
- setting_info->device_status |= LCD2_Device;
-
- setting_info->samm_status = viafb_SAMM_ON;
- setting_info->primary_device = get_primary_device();
-
- setting_info->first_dev_bpp = viafb_bpp;
- setting_info->second_dev_bpp = viafb_bpp1;
-
- setting_info->first_dev_refresh = viafb_refresh;
- setting_info->second_dev_refresh = viafb_refresh1;
-
- setting_info->first_dev_hor_res = viafb_hotplug_Xres;
- setting_info->first_dev_ver_res = viafb_hotplug_Yres;
- setting_info->second_dev_hor_res = viafb_second_xres;
- setting_info->second_dev_ver_res = viafb_second_yres;
-
- /* Get lcd attributes */
- setting_info->lcd_attributes.display_center = viafb_lcd_dsp_method;
- setting_info->lcd_attributes.panel_id = viafb_lcd_panel_id;
- setting_info->lcd_attributes.lcd_mode = viafb_lcd_mode;
-}
-
-static int __init parse_active_dev(void)
-{
- viafb_CRT_ON = STATE_OFF;
- viafb_DVI_ON = STATE_OFF;
- viafb_LCD_ON = STATE_OFF;
- viafb_LCD2_ON = STATE_OFF;
- /* 1. Modify the active status of devices. */
- /* 2. Keep the order of devices, so we can set corresponding
- IGA path to devices in SAMM case. */
- /* Note: The previous of active_dev is primary device,
- and the following is secondary device. */
- if (!viafb_active_dev) {
- if (machine_is_olpc()) { /* LCD only */
- viafb_LCD_ON = STATE_ON;
- viafb_SAMM_ON = STATE_OFF;
- } else {
- viafb_CRT_ON = STATE_ON;
- viafb_SAMM_ON = STATE_OFF;
- }
- } else if (!strcmp(viafb_active_dev, "CRT+DVI")) {
- /* CRT+DVI */
- viafb_CRT_ON = STATE_ON;
- viafb_DVI_ON = STATE_ON;
- viafb_primary_dev = CRT_Device;
- } else if (!strcmp(viafb_active_dev, "DVI+CRT")) {
- /* DVI+CRT */
- viafb_CRT_ON = STATE_ON;
- viafb_DVI_ON = STATE_ON;
- viafb_primary_dev = DVI_Device;
- } else if (!strcmp(viafb_active_dev, "CRT+LCD")) {
- /* CRT+LCD */
- viafb_CRT_ON = STATE_ON;
- viafb_LCD_ON = STATE_ON;
- viafb_primary_dev = CRT_Device;
- } else if (!strcmp(viafb_active_dev, "LCD+CRT")) {
- /* LCD+CRT */
- viafb_CRT_ON = STATE_ON;
- viafb_LCD_ON = STATE_ON;
- viafb_primary_dev = LCD_Device;
- } else if (!strcmp(viafb_active_dev, "DVI+LCD")) {
- /* DVI+LCD */
- viafb_DVI_ON = STATE_ON;
- viafb_LCD_ON = STATE_ON;
- viafb_primary_dev = DVI_Device;
- } else if (!strcmp(viafb_active_dev, "LCD+DVI")) {
- /* LCD+DVI */
- viafb_DVI_ON = STATE_ON;
- viafb_LCD_ON = STATE_ON;
- viafb_primary_dev = LCD_Device;
- } else if (!strcmp(viafb_active_dev, "LCD+LCD2")) {
- viafb_LCD_ON = STATE_ON;
- viafb_LCD2_ON = STATE_ON;
- viafb_primary_dev = LCD_Device;
- } else if (!strcmp(viafb_active_dev, "LCD2+LCD")) {
- viafb_LCD_ON = STATE_ON;
- viafb_LCD2_ON = STATE_ON;
- viafb_primary_dev = LCD2_Device;
- } else if (!strcmp(viafb_active_dev, "CRT")) {
- /* CRT only */
- viafb_CRT_ON = STATE_ON;
- viafb_SAMM_ON = STATE_OFF;
- } else if (!strcmp(viafb_active_dev, "DVI")) {
- /* DVI only */
- viafb_DVI_ON = STATE_ON;
- viafb_SAMM_ON = STATE_OFF;
- } else if (!strcmp(viafb_active_dev, "LCD")) {
- /* LCD only */
- viafb_LCD_ON = STATE_ON;
- viafb_SAMM_ON = STATE_OFF;
- } else
- return -EINVAL;
-
- return 0;
-}
-
-static int parse_port(char *opt_str, int *output_interface)
-{
- if (!strncmp(opt_str, "DVP0", 4))
- *output_interface = INTERFACE_DVP0;
- else if (!strncmp(opt_str, "DVP1", 4))
- *output_interface = INTERFACE_DVP1;
- else if (!strncmp(opt_str, "DFP_HIGHLOW", 11))
- *output_interface = INTERFACE_DFP;
- else if (!strncmp(opt_str, "DFP_HIGH", 8))
- *output_interface = INTERFACE_DFP_HIGH;
- else if (!strncmp(opt_str, "DFP_LOW", 7))
- *output_interface = INTERFACE_DFP_LOW;
- else
- *output_interface = INTERFACE_NONE;
- return 0;
-}
-
-static void parse_lcd_port(void)
-{
- parse_port(viafb_lcd_port, &viaparinfo->chip_info->lvds_chip_info.
- output_interface);
- /*Initialize to avoid unexpected behavior */
- viaparinfo->chip_info->lvds_chip_info2.output_interface =
- INTERFACE_NONE;
-
- DEBUG_MSG(KERN_INFO "parse_lcd_port: viafb_lcd_port:%s,interface:%d\n",
- viafb_lcd_port, viaparinfo->chip_info->lvds_chip_info.
- output_interface);
-}
-
-static void parse_dvi_port(void)
-{
- parse_port(viafb_dvi_port, &viaparinfo->chip_info->tmds_chip_info.
- output_interface);
-
- DEBUG_MSG(KERN_INFO "parse_dvi_port: viafb_dvi_port:%s,interface:%d\n",
- viafb_dvi_port, viaparinfo->chip_info->tmds_chip_info.
- output_interface);
-}
-
-#ifdef CONFIG_FB_VIA_DIRECT_PROCFS
-
-/*
- * The proc filesystem read/write function, a simple proc implement to
- * get/set the value of DPA DVP0, DVP0DataDriving, DVP0ClockDriving, DVP1,
- * DVP1Driving, DFPHigh, DFPLow CR96, SR2A[5], SR1B[1], SR2A[4], SR1E[2],
- * CR9B, SR65, CR97, CR99
- */
-static int viafb_dvp0_proc_show(struct seq_file *m, void *v)
-{
- u8 dvp0_data_dri = 0, dvp0_clk_dri = 0, dvp0 = 0;
- dvp0_data_dri =
- (viafb_read_reg(VIASR, SR2A) & BIT5) >> 4 |
- (viafb_read_reg(VIASR, SR1B) & BIT1) >> 1;
- dvp0_clk_dri =
- (viafb_read_reg(VIASR, SR2A) & BIT4) >> 3 |
- (viafb_read_reg(VIASR, SR1E) & BIT2) >> 2;
- dvp0 = viafb_read_reg(VIACR, CR96) & 0x0f;
- seq_printf(m, "%x %x %x\n", dvp0, dvp0_data_dri, dvp0_clk_dri);
- return 0;
-}
-
-static int viafb_dvp0_proc_open(struct inode *inode, struct file *file)
-{
- return single_open(file, viafb_dvp0_proc_show, NULL);
-}
-
-static ssize_t viafb_dvp0_proc_write(struct file *file,
- const char __user *buffer, size_t count, loff_t *pos)
-{
- char buf[20], *value, *pbuf;
- u8 reg_val = 0;
- unsigned long length, i;
- if (count < 1)
- return -EINVAL;
- length = count > 20 ? 20 : count;
- if (copy_from_user(&buf[0], buffer, length))
- return -EFAULT;
- buf[length - 1] = '\0'; /*Ensure end string */
- pbuf = &buf[0];
- for (i = 0; i < 3; i++) {
- value = strsep(&pbuf, " ");
- if (value != NULL) {
- if (kstrtou8(value, 0, &reg_val) < 0)
- return -EINVAL;
- DEBUG_MSG(KERN_INFO "DVP0:reg_val[%l]=:%x\n", i,
- reg_val);
- switch (i) {
- case 0:
- viafb_write_reg_mask(CR96, VIACR,
- reg_val, 0x0f);
- break;
- case 1:
- viafb_write_reg_mask(SR2A, VIASR,
- reg_val << 4, BIT5);
- viafb_write_reg_mask(SR1B, VIASR,
- reg_val << 1, BIT1);
- break;
- case 2:
- viafb_write_reg_mask(SR2A, VIASR,
- reg_val << 3, BIT4);
- viafb_write_reg_mask(SR1E, VIASR,
- reg_val << 2, BIT2);
- break;
- default:
- break;
- }
- } else {
- break;
- }
- }
- return count;
-}
-
-static const struct file_operations viafb_dvp0_proc_fops = {
- .owner = THIS_MODULE,
- .open = viafb_dvp0_proc_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
- .write = viafb_dvp0_proc_write,
-};
-
-static int viafb_dvp1_proc_show(struct seq_file *m, void *v)
-{
- u8 dvp1 = 0, dvp1_data_dri = 0, dvp1_clk_dri = 0;
- dvp1 = viafb_read_reg(VIACR, CR9B) & 0x0f;
- dvp1_data_dri = (viafb_read_reg(VIASR, SR65) & 0x0c) >> 2;
- dvp1_clk_dri = viafb_read_reg(VIASR, SR65) & 0x03;
- seq_printf(m, "%x %x %x\n", dvp1, dvp1_data_dri, dvp1_clk_dri);
- return 0;
-}
-
-static int viafb_dvp1_proc_open(struct inode *inode, struct file *file)
-{
- return single_open(file, viafb_dvp1_proc_show, NULL);
-}
-
-static ssize_t viafb_dvp1_proc_write(struct file *file,
- const char __user *buffer, size_t count, loff_t *pos)
-{
- char buf[20], *value, *pbuf;
- u8 reg_val = 0;
- unsigned long length, i;
- if (count < 1)
- return -EINVAL;
- length = count > 20 ? 20 : count;
- if (copy_from_user(&buf[0], buffer, length))
- return -EFAULT;
- buf[length - 1] = '\0'; /*Ensure end string */
- pbuf = &buf[0];
- for (i = 0; i < 3; i++) {
- value = strsep(&pbuf, " ");
- if (value != NULL) {
- if (kstrtou8(value, 0, &reg_val) < 0)
- return -EINVAL;
- switch (i) {
- case 0:
- viafb_write_reg_mask(CR9B, VIACR,
- reg_val, 0x0f);
- break;
- case 1:
- viafb_write_reg_mask(SR65, VIASR,
- reg_val << 2, 0x0c);
- break;
- case 2:
- viafb_write_reg_mask(SR65, VIASR,
- reg_val, 0x03);
- break;
- default:
- break;
- }
- } else {
- break;
- }
- }
- return count;
-}
-
-static const struct file_operations viafb_dvp1_proc_fops = {
- .owner = THIS_MODULE,
- .open = viafb_dvp1_proc_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
- .write = viafb_dvp1_proc_write,
-};
-
-static int viafb_dfph_proc_show(struct seq_file *m, void *v)
-{
- u8 dfp_high = 0;
- dfp_high = viafb_read_reg(VIACR, CR97) & 0x0f;
- seq_printf(m, "%x\n", dfp_high);
- return 0;
-}
-
-static int viafb_dfph_proc_open(struct inode *inode, struct file *file)
-{
- return single_open(file, viafb_dfph_proc_show, NULL);
-}
-
-static ssize_t viafb_dfph_proc_write(struct file *file,
- const char __user *buffer, size_t count, loff_t *pos)
-{
- int err;
- u8 reg_val;
- err = kstrtou8_from_user(buffer, count, 0, &reg_val);
- if (err)
- return err;
-
- viafb_write_reg_mask(CR97, VIACR, reg_val, 0x0f);
- return count;
-}
-
-static const struct file_operations viafb_dfph_proc_fops = {
- .owner = THIS_MODULE,
- .open = viafb_dfph_proc_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
- .write = viafb_dfph_proc_write,
-};
-
-static int viafb_dfpl_proc_show(struct seq_file *m, void *v)
-{
- u8 dfp_low = 0;
- dfp_low = viafb_read_reg(VIACR, CR99) & 0x0f;
- seq_printf(m, "%x\n", dfp_low);
- return 0;
-}
-
-static int viafb_dfpl_proc_open(struct inode *inode, struct file *file)
-{
- return single_open(file, viafb_dfpl_proc_show, NULL);
-}
-
-static ssize_t viafb_dfpl_proc_write(struct file *file,
- const char __user *buffer, size_t count, loff_t *pos)
-{
- int err;
- u8 reg_val;
- err = kstrtou8_from_user(buffer, count, 0, &reg_val);
- if (err)
- return err;
-
- viafb_write_reg_mask(CR99, VIACR, reg_val, 0x0f);
- return count;
-}
-
-static const struct file_operations viafb_dfpl_proc_fops = {
- .owner = THIS_MODULE,
- .open = viafb_dfpl_proc_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
- .write = viafb_dfpl_proc_write,
-};
-
-static int viafb_vt1636_proc_show(struct seq_file *m, void *v)
-{
- u8 vt1636_08 = 0, vt1636_09 = 0;
- switch (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name) {
- case VT1636_LVDS:
- vt1636_08 =
- viafb_gpio_i2c_read_lvds(viaparinfo->lvds_setting_info,
- &viaparinfo->chip_info->lvds_chip_info, 0x08) & 0x0f;
- vt1636_09 =
- viafb_gpio_i2c_read_lvds(viaparinfo->lvds_setting_info,
- &viaparinfo->chip_info->lvds_chip_info, 0x09) & 0x1f;
- seq_printf(m, "%x %x\n", vt1636_08, vt1636_09);
- break;
- default:
- break;
- }
- switch (viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) {
- case VT1636_LVDS:
- vt1636_08 =
- viafb_gpio_i2c_read_lvds(viaparinfo->lvds_setting_info2,
- &viaparinfo->chip_info->lvds_chip_info2, 0x08) & 0x0f;
- vt1636_09 =
- viafb_gpio_i2c_read_lvds(viaparinfo->lvds_setting_info2,
- &viaparinfo->chip_info->lvds_chip_info2, 0x09) & 0x1f;
- seq_printf(m, " %x %x\n", vt1636_08, vt1636_09);
- break;
- default:
- break;
- }
- return 0;
-}
-
-static int viafb_vt1636_proc_open(struct inode *inode, struct file *file)
-{
- return single_open(file, viafb_vt1636_proc_show, NULL);
-}
-
-static ssize_t viafb_vt1636_proc_write(struct file *file,
- const char __user *buffer, size_t count, loff_t *pos)
-{
- char buf[30], *value, *pbuf;
- struct IODATA reg_val;
- unsigned long length, i;
- if (count < 1)
- return -EINVAL;
- length = count > 30 ? 30 : count;
- if (copy_from_user(&buf[0], buffer, length))
- return -EFAULT;
- buf[length - 1] = '\0'; /*Ensure end string */
- pbuf = &buf[0];
- switch (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name) {
- case VT1636_LVDS:
- for (i = 0; i < 2; i++) {
- value = strsep(&pbuf, " ");
- if (value != NULL) {
- if (kstrtou8(value, 0, &reg_val.Data) < 0)
- return -EINVAL;
- switch (i) {
- case 0:
- reg_val.Index = 0x08;
- reg_val.Mask = 0x0f;
- viafb_gpio_i2c_write_mask_lvds
- (viaparinfo->lvds_setting_info,
- &viaparinfo->
- chip_info->lvds_chip_info,
- reg_val);
- break;
- case 1:
- reg_val.Index = 0x09;
- reg_val.Mask = 0x1f;
- viafb_gpio_i2c_write_mask_lvds
- (viaparinfo->lvds_setting_info,
- &viaparinfo->
- chip_info->lvds_chip_info,
- reg_val);
- break;
- default:
- break;
- }
- } else {
- break;
- }
- }
- break;
- default:
- break;
- }
- switch (viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) {
- case VT1636_LVDS:
- for (i = 0; i < 2; i++) {
- value = strsep(&pbuf, " ");
- if (value != NULL) {
- if (kstrtou8(value, 0, &reg_val.Data) < 0)
- return -EINVAL;
- switch (i) {
- case 0:
- reg_val.Index = 0x08;
- reg_val.Mask = 0x0f;
- viafb_gpio_i2c_write_mask_lvds
- (viaparinfo->lvds_setting_info2,
- &viaparinfo->
- chip_info->lvds_chip_info2,
- reg_val);
- break;
- case 1:
- reg_val.Index = 0x09;
- reg_val.Mask = 0x1f;
- viafb_gpio_i2c_write_mask_lvds
- (viaparinfo->lvds_setting_info2,
- &viaparinfo->
- chip_info->lvds_chip_info2,
- reg_val);
- break;
- default:
- break;
- }
- } else {
- break;
- }
- }
- break;
- default:
- break;
- }
- return count;
-}
-
-static const struct file_operations viafb_vt1636_proc_fops = {
- .owner = THIS_MODULE,
- .open = viafb_vt1636_proc_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
- .write = viafb_vt1636_proc_write,
-};
-
-#endif /* CONFIG_FB_VIA_DIRECT_PROCFS */
-
-static int viafb_sup_odev_proc_show(struct seq_file *m, void *v)
-{
- via_odev_to_seq(m, supported_odev_map[
- viaparinfo->shared->chip_info.gfx_chip_name]);
- return 0;
-}
-
-static int viafb_sup_odev_proc_open(struct inode *inode, struct file *file)
-{
- return single_open(file, viafb_sup_odev_proc_show, NULL);
-}
-
-static const struct file_operations viafb_sup_odev_proc_fops = {
- .owner = THIS_MODULE,
- .open = viafb_sup_odev_proc_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
-};
-
-static ssize_t odev_update(const char __user *buffer, size_t count, u32 *odev)
-{
- char buf[64], *ptr = buf;
- u32 devices;
- bool add, sub;
-
- if (count < 1 || count > 63)
- return -EINVAL;
- if (copy_from_user(&buf[0], buffer, count))
- return -EFAULT;
- buf[count] = '\0';
- add = buf[0] == '+';
- sub = buf[0] == '-';
- if (add || sub)
- ptr++;
- devices = via_parse_odev(ptr, &ptr);
- if (*ptr == '\n')
- ptr++;
- if (*ptr != 0)
- return -EINVAL;
- if (add)
- *odev |= devices;
- else if (sub)
- *odev &= ~devices;
- else
- *odev = devices;
- return count;
-}
-
-static int viafb_iga1_odev_proc_show(struct seq_file *m, void *v)
-{
- via_odev_to_seq(m, viaparinfo->shared->iga1_devices);
- return 0;
-}
-
-static int viafb_iga1_odev_proc_open(struct inode *inode, struct file *file)
-{
- return single_open(file, viafb_iga1_odev_proc_show, NULL);
-}
-
-static ssize_t viafb_iga1_odev_proc_write(struct file *file,
- const char __user *buffer, size_t count, loff_t *pos)
-{
- u32 dev_on, dev_off, dev_old, dev_new;
- ssize_t res;
-
- dev_old = dev_new = viaparinfo->shared->iga1_devices;
- res = odev_update(buffer, count, &dev_new);
- if (res != count)
- return res;
- dev_off = dev_old & ~dev_new;
- dev_on = dev_new & ~dev_old;
- viaparinfo->shared->iga1_devices = dev_new;
- viaparinfo->shared->iga2_devices &= ~dev_new;
- via_set_state(dev_off, VIA_STATE_OFF);
- via_set_source(dev_new, IGA1);
- via_set_state(dev_on, VIA_STATE_ON);
- return res;
-}
-
-static const struct file_operations viafb_iga1_odev_proc_fops = {
- .owner = THIS_MODULE,
- .open = viafb_iga1_odev_proc_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
- .write = viafb_iga1_odev_proc_write,
-};
-
-static int viafb_iga2_odev_proc_show(struct seq_file *m, void *v)
-{
- via_odev_to_seq(m, viaparinfo->shared->iga2_devices);
- return 0;
-}
-
-static int viafb_iga2_odev_proc_open(struct inode *inode, struct file *file)
-{
- return single_open(file, viafb_iga2_odev_proc_show, NULL);
-}
-
-static ssize_t viafb_iga2_odev_proc_write(struct file *file,
- const char __user *buffer, size_t count, loff_t *pos)
-{
- u32 dev_on, dev_off, dev_old, dev_new;
- ssize_t res;
-
- dev_old = dev_new = viaparinfo->shared->iga2_devices;
- res = odev_update(buffer, count, &dev_new);
- if (res != count)
- return res;
- dev_off = dev_old & ~dev_new;
- dev_on = dev_new & ~dev_old;
- viaparinfo->shared->iga2_devices = dev_new;
- viaparinfo->shared->iga1_devices &= ~dev_new;
- via_set_state(dev_off, VIA_STATE_OFF);
- via_set_source(dev_new, IGA2);
- via_set_state(dev_on, VIA_STATE_ON);
- return res;
-}
-
-static const struct file_operations viafb_iga2_odev_proc_fops = {
- .owner = THIS_MODULE,
- .open = viafb_iga2_odev_proc_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
- .write = viafb_iga2_odev_proc_write,
-};
-
-#define IS_VT1636(lvds_chip) ((lvds_chip).lvds_chip_name == VT1636_LVDS)
-static void viafb_init_proc(struct viafb_shared *shared)
-{
- struct proc_dir_entry *iga1_entry, *iga2_entry,
- *viafb_entry = proc_mkdir("viafb", NULL);
-
- shared->proc_entry = viafb_entry;
- if (viafb_entry) {
-#ifdef CONFIG_FB_VIA_DIRECT_PROCFS
- proc_create("dvp0", 0, viafb_entry, &viafb_dvp0_proc_fops);
- proc_create("dvp1", 0, viafb_entry, &viafb_dvp1_proc_fops);
- proc_create("dfph", 0, viafb_entry, &viafb_dfph_proc_fops);
- proc_create("dfpl", 0, viafb_entry, &viafb_dfpl_proc_fops);
- if (IS_VT1636(shared->chip_info.lvds_chip_info)
- || IS_VT1636(shared->chip_info.lvds_chip_info2))
- proc_create("vt1636", 0, viafb_entry,
- &viafb_vt1636_proc_fops);
-#endif /* CONFIG_FB_VIA_DIRECT_PROCFS */
-
- proc_create("supported_output_devices", 0, viafb_entry,
- &viafb_sup_odev_proc_fops);
- iga1_entry = proc_mkdir("iga1", viafb_entry);
- shared->iga1_proc_entry = iga1_entry;
- proc_create("output_devices", 0, iga1_entry,
- &viafb_iga1_odev_proc_fops);
- iga2_entry = proc_mkdir("iga2", viafb_entry);
- shared->iga2_proc_entry = iga2_entry;
- proc_create("output_devices", 0, iga2_entry,
- &viafb_iga2_odev_proc_fops);
- }
-}
-static void viafb_remove_proc(struct viafb_shared *shared)
-{
- struct proc_dir_entry *viafb_entry = shared->proc_entry,
- *iga1_entry = shared->iga1_proc_entry,
- *iga2_entry = shared->iga2_proc_entry;
-
- if (!viafb_entry)
- return;
-
- remove_proc_entry("output_devices", iga2_entry);
- remove_proc_entry("iga2", viafb_entry);
- remove_proc_entry("output_devices", iga1_entry);
- remove_proc_entry("iga1", viafb_entry);
- remove_proc_entry("supported_output_devices", viafb_entry);
-
-#ifdef CONFIG_FB_VIA_DIRECT_PROCFS
- remove_proc_entry("dvp0", viafb_entry);/* parent dir */
- remove_proc_entry("dvp1", viafb_entry);
- remove_proc_entry("dfph", viafb_entry);
- remove_proc_entry("dfpl", viafb_entry);
- if (IS_VT1636(shared->chip_info.lvds_chip_info)
- || IS_VT1636(shared->chip_info.lvds_chip_info2))
- remove_proc_entry("vt1636", viafb_entry);
-#endif /* CONFIG_FB_VIA_DIRECT_PROCFS */
-
- remove_proc_entry("viafb", NULL);
-}
-#undef IS_VT1636
-
-static int parse_mode(const char *str, u32 devices, u32 *xres, u32 *yres)
-{
- const struct fb_videomode *mode = NULL;
- char *ptr;
-
- if (!str) {
- if (devices == VIA_CRT)
- mode = via_aux_get_preferred_mode(
- viaparinfo->shared->i2c_26);
- else if (devices == VIA_DVP1)
- mode = via_aux_get_preferred_mode(
- viaparinfo->shared->i2c_31);
-
- if (mode) {
- *xres = mode->xres;
- *yres = mode->yres;
- } else if (machine_is_olpc()) {
- *xres = 1200;
- *yres = 900;
- } else {
- *xres = 640;
- *yres = 480;
- }
- return 0;
- }
-
- *xres = simple_strtoul(str, &ptr, 10);
- if (ptr[0] != 'x')
- return -EINVAL;
-
- *yres = simple_strtoul(&ptr[1], &ptr, 10);
- if (ptr[0])
- return -EINVAL;
-
- return 0;
-}
-
-
-#ifdef CONFIG_PM
-static int viafb_suspend(void *unused)
-{
- console_lock();
- fb_set_suspend(viafbinfo, 1);
- viafb_sync(viafbinfo);
- console_unlock();
-
- return 0;
-}
-
-static int viafb_resume(void *unused)
-{
- console_lock();
- if (viaparinfo->shared->vdev->engine_mmio)
- viafb_reset_engine(viaparinfo);
- viafb_set_par(viafbinfo);
- if (viafb_dual_fb)
- viafb_set_par(viafbinfo1);
- fb_set_suspend(viafbinfo, 0);
-
- console_unlock();
- return 0;
-}
-
-static struct viafb_pm_hooks viafb_fb_pm_hooks = {
- .suspend = viafb_suspend,
- .resume = viafb_resume
-};
-
-#endif
-
-static void i2c_bus_probe(struct viafb_shared *shared)
-{
- /* should be always CRT */
- printk(KERN_INFO "viafb: Probing I2C bus 0x26\n");
- shared->i2c_26 = via_aux_probe(viafb_find_i2c_adapter(VIA_PORT_26));
-
- /* seems to be usually DVP1 */
- printk(KERN_INFO "viafb: Probing I2C bus 0x31\n");
- shared->i2c_31 = via_aux_probe(viafb_find_i2c_adapter(VIA_PORT_31));
-
- /* FIXME: what is this? */
- if (!machine_is_olpc()) {
- printk(KERN_INFO "viafb: Probing I2C bus 0x2C\n");
- shared->i2c_2C = via_aux_probe(viafb_find_i2c_adapter(VIA_PORT_2C));
- }
-
- printk(KERN_INFO "viafb: Finished I2C bus probing");
-}
-
-static void i2c_bus_free(struct viafb_shared *shared)
-{
- via_aux_free(shared->i2c_26);
- via_aux_free(shared->i2c_31);
- via_aux_free(shared->i2c_2C);
-}
-
-int via_fb_pci_probe(struct viafb_dev *vdev)
-{
- u32 default_xres, default_yres;
- struct fb_var_screeninfo default_var;
- int rc;
- u32 viafb_par_length;
-
- DEBUG_MSG(KERN_INFO "VIAFB PCI Probe!!\n");
- memset(&default_var, 0, sizeof(default_var));
- viafb_par_length = ALIGN(sizeof(struct viafb_par), BITS_PER_LONG/8);
-
- /* Allocate fb_info and ***_par here, also including some other needed
- * variables
- */
- viafbinfo = framebuffer_alloc(viafb_par_length +
- ALIGN(sizeof(struct viafb_shared), BITS_PER_LONG/8),
- &vdev->pdev->dev);
- if (!viafbinfo) {
- printk(KERN_ERR"Could not allocate memory for viafb_info.\n");
- return -ENOMEM;
- }
-
- viaparinfo = (struct viafb_par *)viafbinfo->par;
- viaparinfo->shared = viafbinfo->par + viafb_par_length;
- viaparinfo->shared->vdev = vdev;
- viaparinfo->vram_addr = 0;
- viaparinfo->tmds_setting_info = &viaparinfo->shared->tmds_setting_info;
- viaparinfo->lvds_setting_info = &viaparinfo->shared->lvds_setting_info;
- viaparinfo->lvds_setting_info2 =
- &viaparinfo->shared->lvds_setting_info2;
- viaparinfo->chip_info = &viaparinfo->shared->chip_info;
-
- i2c_bus_probe(viaparinfo->shared);
- if (viafb_dual_fb)
- viafb_SAMM_ON = 1;
- parse_lcd_port();
- parse_dvi_port();
-
- viafb_init_chip_info(vdev->chip_type);
- /*
- * The framebuffer will have been successfully mapped by
- * the core (or we'd not be here), but we still need to
- * set up our own accounting.
- */
- viaparinfo->fbmem = vdev->fbmem_start;
- viaparinfo->memsize = vdev->fbmem_len;
- viaparinfo->fbmem_free = viaparinfo->memsize;
- viaparinfo->fbmem_used = 0;
- viafbinfo->screen_base = vdev->fbmem;
-
- viafbinfo->fix.mmio_start = vdev->engine_start;
- viafbinfo->fix.mmio_len = vdev->engine_len;
- viafbinfo->node = 0;
- viafbinfo->fbops = &viafb_ops;
- viafbinfo->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
-
- viafbinfo->pseudo_palette = pseudo_pal;
- if (viafb_accel && !viafb_setup_engine(viafbinfo)) {
- viafbinfo->flags |= FBINFO_HWACCEL_COPYAREA |
- FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_IMAGEBLIT;
- default_var.accel_flags = FB_ACCELF_TEXT;
- } else {
- viafbinfo->flags |= FBINFO_HWACCEL_DISABLED;
- default_var.accel_flags = 0;
- }
-
- if (viafb_second_size && (viafb_second_size < 8)) {
- viafb_second_offset = viaparinfo->fbmem_free -
- viafb_second_size * 1024 * 1024;
- } else {
- viafb_second_size = 8;
- viafb_second_offset = viaparinfo->fbmem_free -
- viafb_second_size * 1024 * 1024;
- }
-
- parse_mode(viafb_mode, viaparinfo->shared->iga1_devices,
- &default_xres, &default_yres);
- if (viafb_SAMM_ON == 1)
- parse_mode(viafb_mode1, viaparinfo->shared->iga2_devices,
- &viafb_second_xres, &viafb_second_yres);
-
- default_var.xres = default_xres;
- default_var.yres = default_yres;
- default_var.xres_virtual = default_xres;
- default_var.yres_virtual = default_yres;
- default_var.bits_per_pixel = viafb_bpp;
- viafb_fill_var_timing_info(&default_var, viafb_get_best_mode(
- default_var.xres, default_var.yres, viafb_refresh));
- viafb_setup_fixinfo(&viafbinfo->fix, viaparinfo);
- viafbinfo->var = default_var;
-
- if (viafb_dual_fb) {
- viafbinfo1 = framebuffer_alloc(viafb_par_length,
- &vdev->pdev->dev);
- if (!viafbinfo1) {
- printk(KERN_ERR
- "allocate the second framebuffer struct error\n");
- rc = -ENOMEM;
- goto out_fb_release;
- }
- viaparinfo1 = viafbinfo1->par;
- memcpy(viaparinfo1, viaparinfo, viafb_par_length);
- viaparinfo1->vram_addr = viafb_second_offset;
- viaparinfo1->memsize = viaparinfo->memsize -
- viafb_second_offset;
- viaparinfo->memsize = viafb_second_offset;
- viaparinfo1->fbmem = viaparinfo->fbmem + viafb_second_offset;
-
- viaparinfo1->fbmem_used = viaparinfo->fbmem_used;
- viaparinfo1->fbmem_free = viaparinfo1->memsize -
- viaparinfo1->fbmem_used;
- viaparinfo->fbmem_free = viaparinfo->memsize;
- viaparinfo->fbmem_used = 0;
-
- viaparinfo->iga_path = IGA1;
- viaparinfo1->iga_path = IGA2;
- memcpy(viafbinfo1, viafbinfo, sizeof(struct fb_info));
- viafbinfo1->par = viaparinfo1;
- viafbinfo1->screen_base = viafbinfo->screen_base +
- viafb_second_offset;
-
- default_var.xres = viafb_second_xres;
- default_var.yres = viafb_second_yres;
- default_var.xres_virtual = viafb_second_xres;
- default_var.yres_virtual = viafb_second_yres;
- default_var.bits_per_pixel = viafb_bpp1;
- viafb_fill_var_timing_info(&default_var, viafb_get_best_mode(
- default_var.xres, default_var.yres, viafb_refresh1));
-
- viafb_setup_fixinfo(&viafbinfo1->fix, viaparinfo1);
- viafb_check_var(&default_var, viafbinfo1);
- viafbinfo1->var = default_var;
- viafb_update_fix(viafbinfo1);
- viaparinfo1->depth = fb_get_color_depth(&viafbinfo1->var,
- &viafbinfo1->fix);
- }
-
- viafb_check_var(&viafbinfo->var, viafbinfo);
- viafb_update_fix(viafbinfo);
- viaparinfo->depth = fb_get_color_depth(&viafbinfo->var,
- &viafbinfo->fix);
- default_var.activate = FB_ACTIVATE_NOW;
- rc = fb_alloc_cmap(&viafbinfo->cmap, 256, 0);
- if (rc)
- goto out_fb1_release;
-
- if (viafb_dual_fb && (viafb_primary_dev == LCD_Device)
- && (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)) {
- rc = register_framebuffer(viafbinfo1);
- if (rc)
- goto out_dealloc_cmap;
- }
- rc = register_framebuffer(viafbinfo);
- if (rc)
- goto out_fb1_unreg_lcd_cle266;
-
- if (viafb_dual_fb && ((viafb_primary_dev != LCD_Device)
- || (viaparinfo->chip_info->gfx_chip_name !=
- UNICHROME_CLE266))) {
- rc = register_framebuffer(viafbinfo1);
- if (rc)
- goto out_fb_unreg;
- }
- DEBUG_MSG(KERN_INFO "fb%d: %s frame buffer device %dx%d-%dbpp\n",
- viafbinfo->node, viafbinfo->fix.id, default_var.xres,
- default_var.yres, default_var.bits_per_pixel);
-
- viafb_init_proc(viaparinfo->shared);
- viafb_init_dac(IGA2);
-
-#ifdef CONFIG_PM
- viafb_pm_register(&viafb_fb_pm_hooks);
-#endif
- return 0;
-
-out_fb_unreg:
- unregister_framebuffer(viafbinfo);
-out_fb1_unreg_lcd_cle266:
- if (viafb_dual_fb && (viafb_primary_dev == LCD_Device)
- && (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266))
- unregister_framebuffer(viafbinfo1);
-out_dealloc_cmap:
- fb_dealloc_cmap(&viafbinfo->cmap);
-out_fb1_release:
- if (viafbinfo1)
- framebuffer_release(viafbinfo1);
-out_fb_release:
- i2c_bus_free(viaparinfo->shared);
- framebuffer_release(viafbinfo);
- return rc;
-}
-
-void via_fb_pci_remove(struct pci_dev *pdev)
-{
- DEBUG_MSG(KERN_INFO "via_pci_remove!\n");
- fb_dealloc_cmap(&viafbinfo->cmap);
- unregister_framebuffer(viafbinfo);
- if (viafb_dual_fb)
- unregister_framebuffer(viafbinfo1);
- viafb_remove_proc(viaparinfo->shared);
- i2c_bus_free(viaparinfo->shared);
- framebuffer_release(viafbinfo);
- if (viafb_dual_fb)
- framebuffer_release(viafbinfo1);
-}
-
-#ifndef MODULE
-static int __init viafb_setup(void)
-{
- char *this_opt;
- char *options;
-
- DEBUG_MSG(KERN_INFO "viafb_setup!\n");
-
- if (fb_get_options("viafb", &options))
- return -ENODEV;
-
- if (!options || !*options)
- return 0;
-
- while ((this_opt = strsep(&options, ",")) != NULL) {
- if (!*this_opt)
- continue;
-
- if (!strncmp(this_opt, "viafb_mode1=", 12)) {
- viafb_mode1 = kstrdup(this_opt + 12, GFP_KERNEL);
- } else if (!strncmp(this_opt, "viafb_mode=", 11)) {
- viafb_mode = kstrdup(this_opt + 11, GFP_KERNEL);
- } else if (!strncmp(this_opt, "viafb_bpp1=", 11)) {
- if (kstrtouint(this_opt + 11, 0, &viafb_bpp1) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_bpp=", 10)) {
- if (kstrtouint(this_opt + 10, 0, &viafb_bpp) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_refresh1=", 15)) {
- if (kstrtoint(this_opt + 15, 0, &viafb_refresh1) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_refresh=", 14)) {
- if (kstrtoint(this_opt + 14, 0, &viafb_refresh) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_lcd_dsp_method=", 21)) {
- if (kstrtoint(this_opt + 21, 0,
- &viafb_lcd_dsp_method) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_lcd_panel_id=", 19)) {
- if (kstrtoint(this_opt + 19, 0,
- &viafb_lcd_panel_id) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_accel=", 12)) {
- if (kstrtoint(this_opt + 12, 0, &viafb_accel) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_SAMM_ON=", 14)) {
- if (kstrtoint(this_opt + 14, 0, &viafb_SAMM_ON) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_active_dev=", 17)) {
- viafb_active_dev = kstrdup(this_opt + 17, GFP_KERNEL);
- } else if (!strncmp(this_opt,
- "viafb_display_hardware_layout=", 30)) {
- if (kstrtoint(this_opt + 30, 0,
- &viafb_display_hardware_layout) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_second_size=", 18)) {
- if (kstrtoint(this_opt + 18, 0, &viafb_second_size) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt,
- "viafb_platform_epia_dvi=", 24)) {
- if (kstrtoint(this_opt + 24, 0,
- &viafb_platform_epia_dvi) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt,
- "viafb_device_lcd_dualedge=", 26)) {
- if (kstrtoint(this_opt + 26, 0,
- &viafb_device_lcd_dualedge) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_bus_width=", 16)) {
- if (kstrtoint(this_opt + 16, 0, &viafb_bus_width) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_lcd_mode=", 15)) {
- if (kstrtoint(this_opt + 15, 0, &viafb_lcd_mode) < 0)
- return -EINVAL;
- } else if (!strncmp(this_opt, "viafb_lcd_port=", 15)) {
- viafb_lcd_port = kstrdup(this_opt + 15, GFP_KERNEL);
- } else if (!strncmp(this_opt, "viafb_dvi_port=", 15)) {
- viafb_dvi_port = kstrdup(this_opt + 15, GFP_KERNEL);
- }
- }
- return 0;
-}
-#endif
-
-/*
- * These are called out of via-core for now.
- */
-int __init viafb_init(void)
-{
- u32 dummy_x, dummy_y;
- int r = 0;
-
- if (machine_is_olpc())
- /* Apply XO-1.5-specific configuration. */
- viafb_lcd_panel_id = 23;
-
-#ifndef MODULE
- r = viafb_setup();
- if (r < 0)
- return r;
-#endif
- if (parse_mode(viafb_mode, 0, &dummy_x, &dummy_y)
- || !viafb_get_best_mode(dummy_x, dummy_y, viafb_refresh)
- || parse_mode(viafb_mode1, 0, &dummy_x, &dummy_y)
- || !viafb_get_best_mode(dummy_x, dummy_y, viafb_refresh1)
- || viafb_bpp < 0 || viafb_bpp > 32
- || viafb_bpp1 < 0 || viafb_bpp1 > 32
- || parse_active_dev())
- return -EINVAL;
-
- printk(KERN_INFO
- "VIA Graphics Integration Chipset framebuffer %d.%d initializing\n",
- VERSION_MAJOR, VERSION_MINOR);
- return r;
-}
-
-void __exit viafb_exit(void)
-{
- DEBUG_MSG(KERN_INFO "viafb_exit!\n");
-}
-
-static struct fb_ops viafb_ops = {
- .owner = THIS_MODULE,
- .fb_open = viafb_open,
- .fb_release = viafb_release,
- .fb_check_var = viafb_check_var,
- .fb_set_par = viafb_set_par,
- .fb_setcolreg = viafb_setcolreg,
- .fb_pan_display = viafb_pan_display,
- .fb_blank = viafb_blank,
- .fb_fillrect = viafb_fillrect,
- .fb_copyarea = viafb_copyarea,
- .fb_imageblit = viafb_imageblit,
- .fb_cursor = viafb_cursor,
- .fb_ioctl = viafb_ioctl,
- .fb_sync = viafb_sync,
-};
-
-
-#ifdef MODULE
-module_param(viafb_mode, charp, S_IRUSR);
-MODULE_PARM_DESC(viafb_mode, "Set resolution (default=640x480)");
-
-module_param(viafb_mode1, charp, S_IRUSR);
-MODULE_PARM_DESC(viafb_mode1, "Set resolution (default=640x480)");
-
-module_param(viafb_bpp, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_bpp, "Set color depth (default=32bpp)");
-
-module_param(viafb_bpp1, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_bpp1, "Set color depth (default=32bpp)");
-
-module_param(viafb_refresh, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_refresh,
- "Set CRT viafb_refresh rate (default = 60)");
-
-module_param(viafb_refresh1, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_refresh1,
- "Set CRT refresh rate (default = 60)");
-
-module_param(viafb_lcd_panel_id, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_lcd_panel_id,
- "Set Flat Panel type(Default=1024x768)");
-
-module_param(viafb_lcd_dsp_method, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_lcd_dsp_method,
- "Set Flat Panel display scaling method.(Default=Expandsion)");
-
-module_param(viafb_SAMM_ON, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_SAMM_ON,
- "Turn on/off flag of SAMM(Default=OFF)");
-
-module_param(viafb_accel, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_accel,
- "Set 2D Hardware Acceleration: 0 = OFF, 1 = ON (default)");
-
-module_param(viafb_active_dev, charp, S_IRUSR);
-MODULE_PARM_DESC(viafb_active_dev, "Specify active devices.");
-
-module_param(viafb_display_hardware_layout, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_display_hardware_layout,
- "Display Hardware Layout (LCD Only, DVI Only...,etc)");
-
-module_param(viafb_second_size, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_second_size,
- "Set secondary device memory size");
-
-module_param(viafb_dual_fb, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_dual_fb,
- "Turn on/off flag of dual framebuffer devices.(Default = OFF)");
-
-module_param(viafb_platform_epia_dvi, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_platform_epia_dvi,
- "Turn on/off flag of DVI devices on EPIA board.(Default = OFF)");
-
-module_param(viafb_device_lcd_dualedge, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_device_lcd_dualedge,
- "Turn on/off flag of dual edge panel.(Default = OFF)");
-
-module_param(viafb_bus_width, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_bus_width,
- "Set bus width of panel.(Default = 12)");
-
-module_param(viafb_lcd_mode, int, S_IRUSR);
-MODULE_PARM_DESC(viafb_lcd_mode,
- "Set Flat Panel mode(Default=OPENLDI)");
-
-module_param(viafb_lcd_port, charp, S_IRUSR);
-MODULE_PARM_DESC(viafb_lcd_port, "Specify LCD output port.");
-
-module_param(viafb_dvi_port, charp, S_IRUSR);
-MODULE_PARM_DESC(viafb_dvi_port, "Specify DVI output port.");
-
-MODULE_LICENSE("GPL");
-#endif
diff --git a/drivers/video/via/viafbdev.h b/drivers/video/via/viafbdev.h
deleted file mode 100644
index f6b2ddf56e94..000000000000
--- a/drivers/video/via/viafbdev.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __VIAFBDEV_H__
-#define __VIAFBDEV_H__
-
-#include <linux/proc_fs.h>
-#include <linux/fb.h>
-#include <linux/spinlock.h>
-
-#include "via_aux.h"
-#include "ioctl.h"
-#include "share.h"
-#include "chip.h"
-#include "hw.h"
-
-#define VERSION_MAJOR 2
-#define VERSION_KERNEL 6 /* For kernel 2.6 */
-
-#define VERSION_OS 0 /* 0: for 32 bits OS, 1: for 64 bits OS */
-#define VERSION_MINOR 4
-
-#define VIAFB_NUM_I2C 5
-
-struct viafb_shared {
- u32 iga1_devices;
- u32 iga2_devices;
-
- struct proc_dir_entry *proc_entry; /*viafb proc entry */
- struct proc_dir_entry *iga1_proc_entry;
- struct proc_dir_entry *iga2_proc_entry;
- struct viafb_dev *vdev; /* Global dev info */
-
- /* I2C busses that may have auxiliary devices */
- struct via_aux_bus *i2c_26;
- struct via_aux_bus *i2c_31;
- struct via_aux_bus *i2c_2C;
-
- /* All the information will be needed to set engine */
- struct tmds_setting_information tmds_setting_info;
- struct lvds_setting_information lvds_setting_info;
- struct lvds_setting_information lvds_setting_info2;
- struct chip_information chip_info;
-
- /* hardware acceleration stuff */
- u32 cursor_vram_addr;
- u32 vq_vram_addr; /* virtual queue address in video ram */
- int (*hw_bitblt)(void __iomem *engine, u8 op, u32 width, u32 height,
- u8 dst_bpp, u32 dst_addr, u32 dst_pitch, u32 dst_x, u32 dst_y,
- u32 *src_mem, u32 src_addr, u32 src_pitch, u32 src_x, u32 src_y,
- u32 fg_color, u32 bg_color, u8 fill_rop);
-};
-
-struct viafb_par {
- u8 depth;
- u32 vram_addr;
-
- unsigned int fbmem; /*framebuffer physical memory address */
- unsigned int memsize; /*size of fbmem */
- u32 fbmem_free; /* Free FB memory */
- u32 fbmem_used; /* Use FB memory size */
- u32 iga_path;
-
- struct viafb_shared *shared;
-
- /* All the information will be needed to set engine */
- /* depreciated, use the ones in shared directly */
- struct tmds_setting_information *tmds_setting_info;
- struct lvds_setting_information *lvds_setting_info;
- struct lvds_setting_information *lvds_setting_info2;
- struct chip_information *chip_info;
-};
-
-extern int viafb_SAMM_ON;
-extern int viafb_dual_fb;
-extern int viafb_LCD2_ON;
-extern int viafb_LCD_ON;
-extern int viafb_DVI_ON;
-extern int viafb_hotplug;
-
-u8 viafb_gpio_i2c_read_lvds(struct lvds_setting_information
- *plvds_setting_info, struct lvds_chip_information
- *plvds_chip_info, u8 index);
-void viafb_gpio_i2c_write_mask_lvds(struct lvds_setting_information
- *plvds_setting_info, struct lvds_chip_information
- *plvds_chip_info, struct IODATA io_data);
-int via_fb_pci_probe(struct viafb_dev *vdev);
-void via_fb_pci_remove(struct pci_dev *pdev);
-/* Temporary */
-int viafb_init(void);
-void viafb_exit(void);
-#endif /* __VIAFBDEV_H__ */
diff --git a/drivers/video/via/viamode.c b/drivers/video/via/viamode.c
deleted file mode 100644
index 0666ab01cf4a..000000000000
--- a/drivers/video/via/viamode.c
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <linux/via-core.h>
-#include "global.h"
-
-struct io_reg CN400_ModeXregs[] = { {VIASR, SR10, 0xFF, 0x01},
-{VIASR, SR15, 0x02, 0x02},
-{VIASR, SR16, 0xBF, 0x08},
-{VIASR, SR17, 0xFF, 0x1F},
-{VIASR, SR18, 0xFF, 0x4E},
-{VIASR, SR1A, 0xFB, 0x08},
-{VIASR, SR1E, 0x0F, 0x01},
-{VIASR, SR2A, 0xFF, 0x00},
-{VIACR, CR32, 0xFF, 0x00},
-{VIACR, CR33, 0xFF, 0x00},
-{VIACR, CR35, 0xFF, 0x00},
-{VIACR, CR36, 0x08, 0x00},
-{VIACR, CR69, 0xFF, 0x00},
-{VIACR, CR6A, 0xFF, 0x40},
-{VIACR, CR6B, 0xFF, 0x00},
-{VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
-{VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
-{VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
-{VIACR, CR8B, 0xFF, 0x69}, /* LCD Power Sequence Control 0 */
-{VIACR, CR8C, 0xFF, 0x57}, /* LCD Power Sequence Control 1 */
-{VIACR, CR8D, 0xFF, 0x00}, /* LCD Power Sequence Control 2 */
-{VIACR, CR8E, 0xFF, 0x7B}, /* LCD Power Sequence Control 3 */
-{VIACR, CR8F, 0xFF, 0x03}, /* LCD Power Sequence Control 4 */
-{VIACR, CR90, 0xFF, 0x30}, /* LCD Power Sequence Control 5 */
-{VIACR, CR91, 0xFF, 0xA0}, /* 24/12 bit LVDS Data off */
-{VIACR, CR96, 0xFF, 0x00},
-{VIACR, CR97, 0xFF, 0x00},
-{VIACR, CR99, 0xFF, 0x00},
-{VIACR, CR9B, 0xFF, 0x00}
-};
-
-/* Video Mode Table for VT3314 chipset*/
-/* Common Setting for Video Mode */
-struct io_reg CN700_ModeXregs[] = { {VIASR, SR10, 0xFF, 0x01},
-{VIASR, SR15, 0x02, 0x02},
-{VIASR, SR16, 0xBF, 0x08},
-{VIASR, SR17, 0xFF, 0x1F},
-{VIASR, SR18, 0xFF, 0x4E},
-{VIASR, SR1A, 0xFB, 0x82},
-{VIASR, SR1B, 0xFF, 0xF0},
-{VIASR, SR1F, 0xFF, 0x00},
-{VIASR, SR1E, 0xFF, 0x01},
-{VIASR, SR22, 0xFF, 0x1F},
-{VIASR, SR2A, 0x0F, 0x00},
-{VIASR, SR2E, 0xFF, 0xFF},
-{VIASR, SR3F, 0xFF, 0xFF},
-{VIASR, SR40, 0xF7, 0x00},
-{VIASR, CR30, 0xFF, 0x04},
-{VIACR, CR32, 0xFF, 0x00},
-{VIACR, CR33, 0x7F, 0x00},
-{VIACR, CR35, 0xFF, 0x00},
-{VIACR, CR36, 0xFF, 0x31},
-{VIACR, CR41, 0xFF, 0x80},
-{VIACR, CR42, 0xFF, 0x00},
-{VIACR, CR55, 0x80, 0x00},
-{VIACR, CR5D, 0x80, 0x00}, /*Horizontal Retrace Start bit[11] should be 0*/
-{VIACR, CR68, 0xFF, 0x67}, /* Default FIFO For IGA2 */
-{VIACR, CR69, 0xFF, 0x00},
-{VIACR, CR6A, 0xFD, 0x40},
-{VIACR, CR6B, 0xFF, 0x00},
-{VIACR, CR77, 0xFF, 0x00}, /* LCD scaling Factor */
-{VIACR, CR78, 0xFF, 0x00}, /* LCD scaling Factor */
-{VIACR, CR79, 0xFF, 0x00}, /* LCD scaling Factor */
-{VIACR, CR9F, 0x03, 0x00}, /* LCD scaling Factor */
-{VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
-{VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
-{VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
-{VIACR, CR8B, 0xFF, 0x5D}, /* LCD Power Sequence Control 0 */
-{VIACR, CR8C, 0xFF, 0x2B}, /* LCD Power Sequence Control 1 */
-{VIACR, CR8D, 0xFF, 0x6F}, /* LCD Power Sequence Control 2 */
-{VIACR, CR8E, 0xFF, 0x2B}, /* LCD Power Sequence Control 3 */
-{VIACR, CR8F, 0xFF, 0x01}, /* LCD Power Sequence Control 4 */
-{VIACR, CR90, 0xFF, 0x01}, /* LCD Power Sequence Control 5 */
-{VIACR, CR91, 0xFF, 0xA0}, /* 24/12 bit LVDS Data off */
-{VIACR, CR96, 0xFF, 0x00},
-{VIACR, CR97, 0xFF, 0x00},
-{VIACR, CR99, 0xFF, 0x00},
-{VIACR, CR9B, 0xFF, 0x00},
-{VIACR, CR9D, 0xFF, 0x80},
-{VIACR, CR9E, 0xFF, 0x80}
-};
-
-struct io_reg KM400_ModeXregs[] = {
- {VIASR, SR10, 0xFF, 0x01}, /* Unlock Register */
- {VIASR, SR16, 0xFF, 0x08}, /* Display FIFO threshold Control */
- {VIASR, SR17, 0xFF, 0x1F}, /* Display FIFO Control */
- {VIASR, SR18, 0xFF, 0x4E}, /* GFX PREQ threshold */
- {VIASR, SR1A, 0xFF, 0x0a}, /* GFX PREQ threshold */
- {VIASR, SR1F, 0xFF, 0x00}, /* Memory Control 0 */
- {VIASR, SR1B, 0xFF, 0xF0}, /* Power Management Control 0 */
- {VIASR, SR1E, 0xFF, 0x01}, /* Power Management Control */
- {VIASR, SR20, 0xFF, 0x00}, /* Sequencer Arbiter Control 0 */
- {VIASR, SR21, 0xFF, 0x00}, /* Sequencer Arbiter Control 1 */
- {VIASR, SR22, 0xFF, 0x1F}, /* Display Arbiter Control 1 */
- {VIASR, SR2A, 0xFF, 0x00}, /* Power Management Control 5 */
- {VIASR, SR2D, 0xFF, 0xFF}, /* Power Management Control 1 */
- {VIASR, SR2E, 0xFF, 0xFF}, /* Power Management Control 2 */
- {VIACR, CR33, 0xFF, 0x00},
- {VIACR, CR55, 0x80, 0x00},
- {VIACR, CR5D, 0x80, 0x00},
- {VIACR, CR36, 0xFF, 0x01}, /* Power Mangement 3 */
- {VIACR, CR68, 0xFF, 0x67}, /* Default FIFO For IGA2 */
- {VIACR, CR6A, 0x20, 0x20}, /* Extended FIFO On */
- {VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
- {VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
- {VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
- {VIACR, CR8B, 0xFF, 0x2D}, /* LCD Power Sequence Control 0 */
- {VIACR, CR8C, 0xFF, 0x2D}, /* LCD Power Sequence Control 1 */
- {VIACR, CR8D, 0xFF, 0xC8}, /* LCD Power Sequence Control 2 */
- {VIACR, CR8E, 0xFF, 0x36}, /* LCD Power Sequence Control 3 */
- {VIACR, CR8F, 0xFF, 0x00}, /* LCD Power Sequence Control 4 */
- {VIACR, CR90, 0xFF, 0x10}, /* LCD Power Sequence Control 5 */
- {VIACR, CR91, 0xFF, 0xA0}, /* 24/12 bit LVDS Data off */
- {VIACR, CR96, 0xFF, 0x03}, /* DVP0 ; DVP0 Clock Skew */
- {VIACR, CR97, 0xFF, 0x03}, /* DFP high ; DFPH Clock Skew */
- {VIACR, CR99, 0xFF, 0x03}, /* DFP low ; DFPL Clock Skew*/
- {VIACR, CR9B, 0xFF, 0x07} /* DVI on DVP1 ; DVP1 Clock Skew*/
-};
-
-/* For VT3324: Common Setting for Video Mode */
-struct io_reg CX700_ModeXregs[] = { {VIASR, SR10, 0xFF, 0x01},
-{VIASR, SR15, 0x02, 0x02},
-{VIASR, SR16, 0xBF, 0x08},
-{VIASR, SR17, 0xFF, 0x1F},
-{VIASR, SR18, 0xFF, 0x4E},
-{VIASR, SR1A, 0xFB, 0x08},
-{VIASR, SR1B, 0xFF, 0xF0},
-{VIASR, SR1E, 0xFF, 0x01},
-{VIASR, SR2A, 0xFF, 0x00},
-{VIASR, SR2D, 0xC0, 0xC0}, /* delayed E3_ECK */
-{VIACR, CR32, 0xFF, 0x00},
-{VIACR, CR33, 0xFF, 0x00},
-{VIACR, CR35, 0xFF, 0x00},
-{VIACR, CR36, 0x08, 0x00},
-{VIACR, CR47, 0xC8, 0x00}, /* Clear VCK Plus. */
-{VIACR, CR69, 0xFF, 0x00},
-{VIACR, CR6A, 0xFF, 0x40},
-{VIACR, CR6B, 0xFF, 0x00},
-{VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
-{VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
-{VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
-{VIACR, CRD4, 0xFF, 0x81}, /* Second power sequence control */
-{VIACR, CR8B, 0xFF, 0x5D}, /* LCD Power Sequence Control 0 */
-{VIACR, CR8C, 0xFF, 0x2B}, /* LCD Power Sequence Control 1 */
-{VIACR, CR8D, 0xFF, 0x6F}, /* LCD Power Sequence Control 2 */
-{VIACR, CR8E, 0xFF, 0x2B}, /* LCD Power Sequence Control 3 */
-{VIACR, CR8F, 0xFF, 0x01}, /* LCD Power Sequence Control 4 */
-{VIACR, CR90, 0xFF, 0x01}, /* LCD Power Sequence Control 5 */
-{VIACR, CR91, 0xFF, 0x80}, /* 24/12 bit LVDS Data off */
-{VIACR, CR96, 0xFF, 0x00},
-{VIACR, CR97, 0xFF, 0x00},
-{VIACR, CR99, 0xFF, 0x00},
-{VIACR, CR9B, 0xFF, 0x00}
-};
-
-struct io_reg VX855_ModeXregs[] = {
-{VIASR, SR10, 0xFF, 0x01},
-{VIASR, SR15, 0x02, 0x02},
-{VIASR, SR16, 0xBF, 0x08},
-{VIASR, SR17, 0xFF, 0x1F},
-{VIASR, SR18, 0xFF, 0x4E},
-{VIASR, SR1A, 0xFB, 0x08},
-{VIASR, SR1B, 0xFF, 0xF0},
-{VIASR, SR1E, 0x07, 0x01},
-{VIASR, SR2A, 0xF0, 0x00},
-{VIASR, SR58, 0xFF, 0x00},
-{VIASR, SR59, 0xFF, 0x00},
-{VIASR, SR2D, 0xC0, 0xC0}, /* delayed E3_ECK */
-{VIACR, CR32, 0xFF, 0x00},
-{VIACR, CR33, 0x7F, 0x00},
-{VIACR, CR35, 0xFF, 0x00},
-{VIACR, CR36, 0x08, 0x00},
-{VIACR, CR69, 0xFF, 0x00},
-{VIACR, CR6A, 0xFD, 0x60},
-{VIACR, CR6B, 0xFF, 0x00},
-{VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
-{VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
-{VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
-{VIACR, CRD4, 0xFF, 0x81}, /* Second power sequence control */
-{VIACR, CR91, 0xFF, 0x80}, /* 24/12 bit LVDS Data off */
-{VIACR, CR96, 0xFF, 0x00},
-{VIACR, CR97, 0xFF, 0x00},
-{VIACR, CR99, 0xFF, 0x00},
-{VIACR, CR9B, 0xFF, 0x00},
-{VIACR, CRD2, 0xFF, 0xFF} /* TMDS/LVDS control register. */
-};
-
-/* Video Mode Table */
-/* Common Setting for Video Mode */
-struct io_reg CLE266_ModeXregs[] = { {VIASR, SR1E, 0xF0, 0x00},
-{VIASR, SR2A, 0x0F, 0x00},
-{VIASR, SR15, 0x02, 0x02},
-{VIASR, SR16, 0xBF, 0x08},
-{VIASR, SR17, 0xFF, 0x1F},
-{VIASR, SR18, 0xFF, 0x4E},
-{VIASR, SR1A, 0xFB, 0x08},
-
-{VIACR, CR32, 0xFF, 0x00},
-{VIACR, CR35, 0xFF, 0x00},
-{VIACR, CR36, 0x08, 0x00},
-{VIACR, CR6A, 0xFF, 0x80},
-{VIACR, CR6A, 0xFF, 0xC0},
-
-{VIACR, CR55, 0x80, 0x00},
-{VIACR, CR5D, 0x80, 0x00},
-
-{VIAGR, GR20, 0xFF, 0x00},
-{VIAGR, GR21, 0xFF, 0x00},
-{VIAGR, GR22, 0xFF, 0x00},
-
-};
-
-/* Mode:1024X768 */
-struct io_reg PM1024x768[] = { {VIASR, 0x16, 0xBF, 0x0C},
-{VIASR, 0x18, 0xFF, 0x4C}
-};
-
-struct patch_table res_patch_table[] = {
- {ARRAY_SIZE(PM1024x768), PM1024x768}
-};
-
-/* struct VPITTable {
- unsigned char Misc;
- unsigned char SR[StdSR];
- unsigned char CR[StdCR];
- unsigned char GR[StdGR];
- unsigned char AR[StdAR];
- };*/
-
-struct VPITTable VPIT = {
- /* Msic */
- 0xC7,
- /* Sequencer */
- {0x01, 0x0F, 0x00, 0x0E},
- /* Graphic Controller */
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
- /* Attribute Controller */
- {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- 0x01, 0x00, 0x0F, 0x00}
-};
-
-/********************/
-/* Mode Table */
-/********************/
-
-static const struct fb_videomode viafb_modes[] = {
- {NULL, 60, 480, 640, 40285, 72, 24, 19, 1, 48, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 640, 480, 39682, 48, 16, 33, 10, 96, 2, 0, 0, 0},
- {NULL, 75, 640, 480, 31746, 120, 16, 16, 1, 64, 3, 0, 0, 0},
- {NULL, 85, 640, 480, 27780, 80, 56, 25, 1, 56, 3, 0, 0, 0},
- {NULL, 100, 640, 480, 23167, 104, 40, 25, 1, 64, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 120, 640, 480, 19081, 104, 40, 31, 1, 64, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 720, 480, 37426, 88, 16, 13, 1, 72, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 720, 576, 30611, 96, 24, 17, 1, 72, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 800, 600, 25131, 88, 40, 23, 1, 128, 4, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 75, 800, 600, 20202, 160, 16, 21, 1, 80, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 85, 800, 600, 17790, 152, 32, 27, 1, 64, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 100, 800, 600, 14667, 136, 48, 32, 1, 88, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 120, 800, 600, 11911, 144, 56, 39, 1, 88, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 800, 480, 33602, 96, 24, 10, 3, 72, 7, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 848, 480, 31565, 104, 24, 12, 3, 80, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 856, 480, 31517, 104, 16, 13, 1, 88, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1024, 512, 24218, 136, 32, 15, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1024, 600, 20423, 144, 40, 18, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1024, 768, 15385, 160, 24, 29, 3, 136, 6, 0, 0, 0},
- {NULL, 75, 1024, 768, 12703, 176, 16, 28, 1, 96, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 85, 1024, 768, 10581, 208, 48, 36, 1, 96, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 100, 1024, 768, 8825, 184, 72, 42, 1, 112, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 75, 1152, 864, 9259, 256, 64, 32, 1, 128, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1280, 768, 12478, 200, 64, 23, 1, 136, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 50, 1280, 768, 15342, 184, 56, 19, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 960, 600, 21964, 128, 32, 15, 3, 96, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1000, 600, 20803, 144, 40, 18, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1024, 576, 21278, 144, 40, 17, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1088, 612, 18825, 152, 48, 16, 3, 104, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1152, 720, 14974, 168, 56, 19, 3, 112, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1200, 720, 14248, 184, 56, 22, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 49, 1200, 900, 17703, 21, 11, 1, 1, 32, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1280, 600, 16259, 184, 56, 18, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1280, 800, 11938, 200, 72, 22, 3, 128, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1280, 960, 9259, 312, 96, 36, 1, 112, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1280, 1024, 9262, 248, 48, 38, 1, 112, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 75, 1280, 1024, 7409, 248, 16, 38, 1, 144, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 85, 1280, 1024, 6351, 224, 64, 44, 1, 160, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1360, 768, 11759, 208, 72, 22, 3, 136, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1368, 768, 11646, 216, 72, 23, 1, 144, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 50, 1368, 768, 14301, 200, 56, 19, 1, 144, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1368, 768, 11646, 216, 72, 23, 1, 144, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1440, 900, 9372, 232, 80, 25, 3, 152, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 75, 1440, 900, 7311, 248, 96, 33, 3, 152, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1440, 1040, 7993, 248, 96, 33, 1, 152, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1600, 900, 8449, 256, 88, 26, 3, 168, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1600, 1024, 7333, 272, 104, 32, 1, 168, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1600, 1200, 6172, 304, 64, 46, 1, 192, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1680, 1050, 6832, 280, 104, 30, 3, 176, 6, 0, 0, 0},
- {NULL, 75, 1680, 1050, 5339, 296, 120, 40, 3, 176, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1792, 1344, 4883, 328, 128, 46, 1, 200, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1856, 1392, 4581, 352, 96, 43, 1, 224, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1920, 1440, 4273, 344, 128, 56, 1, 208, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 75, 1920, 1440, 3367, 352, 144, 56, 1, 224, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 2048, 1536, 3738, 376, 152, 49, 3, 224, 4, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1280, 720, 13484, 216, 112, 20, 5, 40, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 50, 1280, 720, 16538, 176, 48, 17, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1920, 1080, 5776, 328, 128, 32, 3, 200, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1920, 1200, 5164, 336, 136, 36, 3, 200, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 60, 1400, 1050, 8210, 232, 88, 32, 3, 144, 4, FB_SYNC_VERT_HIGH_ACT, 0, 0},
- {NULL, 75, 1400, 1050, 6398, 248, 104, 42, 3, 144, 4, FB_SYNC_VERT_HIGH_ACT, 0, 0} };
-
-static const struct fb_videomode viafb_rb_modes[] = {
- {NULL, 60, 1360, 768, 13879, 80, 48, 14, 3, 32, 5, FB_SYNC_HOR_HIGH_ACT, 0, 0},
- {NULL, 60, 1440, 900, 11249, 80, 48, 17, 3, 32, 6, FB_SYNC_HOR_HIGH_ACT, 0, 0},
- {NULL, 60, 1400, 1050, 9892, 80, 48, 23, 3, 32, 4, FB_SYNC_HOR_HIGH_ACT, 0, 0},
- {NULL, 60, 1600, 900, 10226, 80, 48, 18, 3, 32, 5, FB_SYNC_HOR_HIGH_ACT, 0, 0},
- {NULL, 60, 1680, 1050, 8387, 80, 48, 21, 3, 32, 6, FB_SYNC_HOR_HIGH_ACT, 0, 0},
- {NULL, 60, 1920, 1080, 7212, 80, 48, 23, 3, 32, 5, FB_SYNC_HOR_HIGH_ACT, 0, 0},
- {NULL, 60, 1920, 1200, 6488, 80, 48, 26, 3, 32, 6, FB_SYNC_HOR_HIGH_ACT, 0, 0} };
-
-int NUM_TOTAL_CN400_ModeXregs = ARRAY_SIZE(CN400_ModeXregs);
-int NUM_TOTAL_CN700_ModeXregs = ARRAY_SIZE(CN700_ModeXregs);
-int NUM_TOTAL_KM400_ModeXregs = ARRAY_SIZE(KM400_ModeXregs);
-int NUM_TOTAL_CX700_ModeXregs = ARRAY_SIZE(CX700_ModeXregs);
-int NUM_TOTAL_VX855_ModeXregs = ARRAY_SIZE(VX855_ModeXregs);
-int NUM_TOTAL_CLE266_ModeXregs = ARRAY_SIZE(CLE266_ModeXregs);
-int NUM_TOTAL_PATCH_MODE = ARRAY_SIZE(res_patch_table);
-
-
-static const struct fb_videomode *get_best_mode(
- const struct fb_videomode *modes, int n,
- int hres, int vres, int refresh)
-{
- const struct fb_videomode *best = NULL;
- int i;
-
- for (i = 0; i < n; i++) {
- if (modes[i].xres != hres || modes[i].yres != vres)
- continue;
-
- if (!best || abs(modes[i].refresh - refresh) <
- abs(best->refresh - refresh))
- best = &modes[i];
- }
-
- return best;
-}
-
-const struct fb_videomode *viafb_get_best_mode(int hres, int vres, int refresh)
-{
- return get_best_mode(viafb_modes, ARRAY_SIZE(viafb_modes),
- hres, vres, refresh);
-}
-
-const struct fb_videomode *viafb_get_best_rb_mode(int hres, int vres,
- int refresh)
-{
- return get_best_mode(viafb_rb_modes, ARRAY_SIZE(viafb_rb_modes),
- hres, vres, refresh);
-}
diff --git a/drivers/video/via/viamode.h b/drivers/video/via/viamode.h
deleted file mode 100644
index dd19106698e7..000000000000
--- a/drivers/video/via/viamode.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __VIAMODE_H__
-#define __VIAMODE_H__
-
-#include "global.h"
-
-struct VPITTable {
- unsigned char Misc;
- unsigned char SR[StdSR];
- unsigned char GR[StdGR];
- unsigned char AR[StdAR];
-};
-
-struct patch_table {
- int table_length;
- struct io_reg *io_reg_table;
-};
-
-extern int NUM_TOTAL_CN400_ModeXregs;
-extern int NUM_TOTAL_CN700_ModeXregs;
-extern int NUM_TOTAL_KM400_ModeXregs;
-extern int NUM_TOTAL_CX700_ModeXregs;
-extern int NUM_TOTAL_VX855_ModeXregs;
-extern int NUM_TOTAL_CLE266_ModeXregs;
-extern int NUM_TOTAL_PATCH_MODE;
-
-extern struct io_reg CN400_ModeXregs[];
-extern struct io_reg CN700_ModeXregs[];
-extern struct io_reg KM400_ModeXregs[];
-extern struct io_reg CX700_ModeXregs[];
-extern struct io_reg VX800_ModeXregs[];
-extern struct io_reg VX855_ModeXregs[];
-extern struct io_reg CLE266_ModeXregs[];
-extern struct io_reg PM1024x768[];
-extern struct patch_table res_patch_table[];
-extern struct VPITTable VPIT;
-
-const struct fb_videomode *viafb_get_best_mode(int hres, int vres,
- int refresh);
-const struct fb_videomode *viafb_get_best_rb_mode(int hres, int vres,
- int refresh);
-
-#endif /* __VIAMODE_H__ */
diff --git a/drivers/video/via/vt1636.c b/drivers/video/via/vt1636.c
deleted file mode 100644
index ee2903b472cf..000000000000
--- a/drivers/video/via/vt1636.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <linux/via-core.h>
-#include <linux/via_i2c.h>
-#include "global.h"
-
-static const struct IODATA common_init_data[] = {
-/* Index, Mask, Value */
- /* Set panel power sequence timing */
- {0x10, 0xC0, 0x00},
- /* T1: VDD on - Data on. Each increment is 1 ms. (50ms = 031h) */
- {0x0B, 0xFF, 0x40},
- /* T2: Data on - Backlight on. Each increment is 2 ms. (210ms = 068h) */
- {0x0C, 0xFF, 0x31},
- /* T3: Backlight off -Data off. Each increment is 2 ms. (210ms = 068h)*/
- {0x0D, 0xFF, 0x31},
- /* T4: Data off - VDD off. Each increment is 1 ms. (50ms = 031h) */
- {0x0E, 0xFF, 0x68},
- /* T5: VDD off - VDD on. Each increment is 100 ms. (500ms = 04h) */
- {0x0F, 0xFF, 0x68},
- /* LVDS output power up */
- {0x09, 0xA0, 0xA0},
- /* turn on back light */
- {0x10, 0x33, 0x13}
-};
-
-/* Index, Mask, Value */
-static const struct IODATA dual_channel_enable_data = {0x08, 0xF0, 0xE0};
-static const struct IODATA single_channel_enable_data = {0x08, 0xF0, 0x00};
-static const struct IODATA dithering_enable_data = {0x0A, 0x70, 0x50};
-static const struct IODATA dithering_disable_data = {0x0A, 0x70, 0x00};
-static const struct IODATA vdd_on_data = {0x10, 0x20, 0x20};
-static const struct IODATA vdd_off_data = {0x10, 0x20, 0x00};
-
-u8 viafb_gpio_i2c_read_lvds(struct lvds_setting_information
- *plvds_setting_info, struct lvds_chip_information *plvds_chip_info,
- u8 index)
-{
- u8 data;
-
- viafb_i2c_readbyte(plvds_chip_info->i2c_port,
- plvds_chip_info->lvds_chip_slave_addr, index, &data);
- return data;
-}
-
-void viafb_gpio_i2c_write_mask_lvds(struct lvds_setting_information
- *plvds_setting_info, struct lvds_chip_information
- *plvds_chip_info, struct IODATA io_data)
-{
- int index, data;
-
- index = io_data.Index;
- data = viafb_gpio_i2c_read_lvds(plvds_setting_info, plvds_chip_info,
- index);
- data = (data & (~io_data.Mask)) | io_data.Data;
-
- viafb_i2c_writebyte(plvds_chip_info->i2c_port,
- plvds_chip_info->lvds_chip_slave_addr, index, data);
-}
-
-void viafb_init_lvds_vt1636(struct lvds_setting_information
- *plvds_setting_info, struct lvds_chip_information *plvds_chip_info)
-{
- int reg_num, i;
-
- /* Common settings: */
- reg_num = ARRAY_SIZE(common_init_data);
- for (i = 0; i < reg_num; i++)
- viafb_gpio_i2c_write_mask_lvds(plvds_setting_info,
- plvds_chip_info, common_init_data[i]);
-
- /* Input Data Mode Select */
- if (plvds_setting_info->device_lcd_dualedge)
- viafb_gpio_i2c_write_mask_lvds(plvds_setting_info,
- plvds_chip_info, dual_channel_enable_data);
- else
- viafb_gpio_i2c_write_mask_lvds(plvds_setting_info,
- plvds_chip_info, single_channel_enable_data);
-
- if (plvds_setting_info->LCDDithering)
- viafb_gpio_i2c_write_mask_lvds(plvds_setting_info,
- plvds_chip_info, dithering_enable_data);
- else
- viafb_gpio_i2c_write_mask_lvds(plvds_setting_info,
- plvds_chip_info, dithering_disable_data);
-}
-
-void viafb_enable_lvds_vt1636(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info)
-{
- viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, plvds_chip_info,
- vdd_on_data);
-}
-
-void viafb_disable_lvds_vt1636(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info)
-{
- viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, plvds_chip_info,
- vdd_off_data);
-}
-
-bool viafb_lvds_identify_vt1636(u8 i2c_adapter)
-{
- u8 Buffer[2];
-
- DEBUG_MSG(KERN_INFO "viafb_lvds_identify_vt1636.\n");
-
- /* Sense VT1636 LVDS Transmiter */
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_slave_addr =
- VT1636_LVDS_I2C_ADDR;
-
- /* Check vendor ID first: */
- if (viafb_i2c_readbyte(i2c_adapter, VT1636_LVDS_I2C_ADDR,
- 0x00, &Buffer[0]))
- return false;
- viafb_i2c_readbyte(i2c_adapter, VT1636_LVDS_I2C_ADDR, 0x01, &Buffer[1]);
-
- if (!((Buffer[0] == 0x06) && (Buffer[1] == 0x11)))
- return false;
-
- /* Check Chip ID: */
- viafb_i2c_readbyte(i2c_adapter, VT1636_LVDS_I2C_ADDR, 0x02, &Buffer[0]);
- viafb_i2c_readbyte(i2c_adapter, VT1636_LVDS_I2C_ADDR, 0x03, &Buffer[1]);
- if ((Buffer[0] == 0x45) && (Buffer[1] == 0x33)) {
- viaparinfo->chip_info->lvds_chip_info.lvds_chip_name =
- VT1636_LVDS;
- return true;
- }
-
- return false;
-}
-
-static int get_clk_range_index(u32 Clk)
-{
- if (Clk < DPA_CLK_30M)
- return DPA_CLK_RANGE_30M;
- else if (Clk < DPA_CLK_50M)
- return DPA_CLK_RANGE_30_50M;
- else if (Clk < DPA_CLK_70M)
- return DPA_CLK_RANGE_50_70M;
- else if (Clk < DPA_CLK_100M)
- return DPA_CLK_RANGE_70_100M;
- else if (Clk < DPA_CLK_150M)
- return DPA_CLK_RANGE_100_150M;
- else
- return DPA_CLK_RANGE_150M;
-}
-
-static void set_dpa_vt1636(struct lvds_setting_information
- *plvds_setting_info, struct lvds_chip_information *plvds_chip_info,
- struct VT1636_DPA_SETTING *p_vt1636_dpa_setting)
-{
- struct IODATA io_data;
-
- io_data.Index = 0x09;
- io_data.Mask = 0x1F;
- io_data.Data = p_vt1636_dpa_setting->CLK_SEL_ST1;
- viafb_gpio_i2c_write_mask_lvds(plvds_setting_info,
- plvds_chip_info, io_data);
-
- io_data.Index = 0x08;
- io_data.Mask = 0x0F;
- io_data.Data = p_vt1636_dpa_setting->CLK_SEL_ST2;
- viafb_gpio_i2c_write_mask_lvds(plvds_setting_info, plvds_chip_info,
- io_data);
-}
-
-void viafb_vt1636_patch_skew_on_vt3324(
- struct lvds_setting_information *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info)
-{
- struct VT1636_DPA_SETTING dpa = {0x00, 0x00}, dpa_16x12 = {0x0B, 0x03},
- *pdpa;
- int index;
-
- DEBUG_MSG(KERN_INFO "viafb_vt1636_patch_skew_on_vt3324.\n");
-
- /* Graphics DPA settings: */
- index = get_clk_range_index(plvds_setting_info->vclk);
- viafb_set_dpa_gfx(plvds_chip_info->output_interface,
- &GFX_DPA_SETTING_TBL_VT3324[index]);
-
- /* LVDS Transmitter DPA settings: */
- if (plvds_setting_info->lcd_panel_hres == 1600 &&
- plvds_setting_info->lcd_panel_vres == 1200)
- pdpa = &dpa_16x12;
- else
- pdpa = &dpa;
-
- set_dpa_vt1636(plvds_setting_info, plvds_chip_info, pdpa);
-}
-
-void viafb_vt1636_patch_skew_on_vt3327(
- struct lvds_setting_information *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info)
-{
- struct VT1636_DPA_SETTING dpa = {0x00, 0x00};
- int index;
-
- DEBUG_MSG(KERN_INFO "viafb_vt1636_patch_skew_on_vt3327.\n");
-
- /* Graphics DPA settings: */
- index = get_clk_range_index(plvds_setting_info->vclk);
- viafb_set_dpa_gfx(plvds_chip_info->output_interface,
- &GFX_DPA_SETTING_TBL_VT3327[index]);
-
- /* LVDS Transmitter DPA settings: */
- set_dpa_vt1636(plvds_setting_info, plvds_chip_info, &dpa);
-}
-
-void viafb_vt1636_patch_skew_on_vt3364(
- struct lvds_setting_information *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info)
-{
- int index;
-
- DEBUG_MSG(KERN_INFO "viafb_vt1636_patch_skew_on_vt3364.\n");
-
- /* Graphics DPA settings: */
- index = get_clk_range_index(plvds_setting_info->vclk);
- viafb_set_dpa_gfx(plvds_chip_info->output_interface,
- &GFX_DPA_SETTING_TBL_VT3364[index]);
-}
diff --git a/drivers/video/via/vt1636.h b/drivers/video/via/vt1636.h
deleted file mode 100644
index 4c1314e57468..000000000000
--- a/drivers/video/via/vt1636.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
-
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation;
- * either version 2, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.See the GNU General Public License
- * for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef _VT1636_H_
-#define _VT1636_H_
-#include "chip.h"
-bool viafb_lvds_identify_vt1636(u8 i2c_adapter);
-void viafb_init_lvds_vt1636(struct lvds_setting_information
- *plvds_setting_info, struct lvds_chip_information *plvds_chip_info);
-void viafb_enable_lvds_vt1636(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-void viafb_disable_lvds_vt1636(struct lvds_setting_information
- *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-void viafb_vt1636_patch_skew_on_vt3324(
- struct lvds_setting_information *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-void viafb_vt1636_patch_skew_on_vt3327(
- struct lvds_setting_information *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-void viafb_vt1636_patch_skew_on_vt3364(
- struct lvds_setting_information *plvds_setting_info,
- struct lvds_chip_information *plvds_chip_info);
-
-#endif