diff options
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2014-02-13 14:31:38 +0100 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2014-04-17 07:10:19 +0200 |
commit | f7018c21350204c4cf628462f229d44d03545254 (patch) | |
tree | 408787177164cf51cc06f7aabdb04fcff8d2b6aa /drivers/video/via | |
parent | video: bf54x-lq043fb: fix build error (diff) | |
download | linux-f7018c21350204c4cf628462f229d44d03545254.tar.xz linux-f7018c21350204c4cf628462f229d44d03545254.zip |
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')
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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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 |