diff options
Diffstat (limited to 'target/linux/s3c24xx/patches-2.6.26/0146-uplevel-samsung-camera-unit.patch.patch')
-rwxr-xr-x | target/linux/s3c24xx/patches-2.6.26/0146-uplevel-samsung-camera-unit.patch.patch | 1690 |
1 files changed, 1690 insertions, 0 deletions
diff --git a/target/linux/s3c24xx/patches-2.6.26/0146-uplevel-samsung-camera-unit.patch.patch b/target/linux/s3c24xx/patches-2.6.26/0146-uplevel-samsung-camera-unit.patch.patch new file mode 100755 index 0000000..26f0035 --- /dev/null +++ b/target/linux/s3c24xx/patches-2.6.26/0146-uplevel-samsung-camera-unit.patch.patch @@ -0,0 +1,1690 @@ +From 0bd2a8e00d4a1814d0a9d8206d52717e3f538b68 Mon Sep 17 00:00:00 2001 +From: Andy Green <andy@opennoko.com> +Date: Fri, 25 Jul 2008 23:06:10 +0100 +Subject: [PATCH] uplevel-samsung-camera-unit.patch + +Update this old code to clk API, I2C changes, official GPIO API +various struct changes, explicit readl() writel(), DMA API changes. +Still not ready for actual use (eg, I2C) but a LOT closer. + +Compiles on 2.6.24 without errors or warnings now. + +Use CONFIG_S3C2440_CAMERA=y in .config + +Signed-off-by: Andy Green <andy@openmoko.com> +--- + arch/arm/mach-s3c2440/Kconfig | 5 +- + arch/arm/mach-s3c2440/Makefile | 9 +- + arch/arm/mach-s3c2440/camera/Makefile | 1 - + arch/arm/mach-s3c2440/camera/cam_reg.h | 92 +++-- + arch/arm/mach-s3c2440/camera/camif.c | 633 +++++++++++++++------------ + arch/arm/mach-s3c2440/camera/camif_fsm.c | 5 + + arch/arm/mach-s3c2440/camera/imgsensor.c | 43 +- + arch/arm/mach-s3c2440/camera/qt-driver.c | 5 +- + arch/arm/mach-s3c2440/camera/video-driver.c | 87 +++-- + arch/arm/mach-s3c2440/camera/videodev.c | 24 +- + arch/arm/mach-s3c2440/camera/videodev.h | 16 +- + 11 files changed, 516 insertions(+), 404 deletions(-) + +diff --git a/arch/arm/mach-s3c2440/Kconfig b/arch/arm/mach-s3c2440/Kconfig +index e042965..20dd2c5 100644 +--- a/arch/arm/mach-s3c2440/Kconfig ++++ b/arch/arm/mach-s3c2440/Kconfig +@@ -30,9 +30,6 @@ config S3C2440_C_FIQ + Support for S3C2440 FIQ support in C -- see + ./arch/arm/macs3c2440/fiq_c_isr.c + +-source "arch/arm/mach-s3c2440/camera/Kconfig" +- +- + menu "S3C2440 Machines" + + config MACH_ANUBIS +@@ -96,3 +93,5 @@ config NEO1973_GTA02_2440 + of the FIC/Openmoko Neo1973 GTA02 GSM Phone. + + endmenu ++ ++#source "arch/arm/mach-s3c2440/camera/Kconfig" +diff --git a/arch/arm/mach-s3c2440/Makefile b/arch/arm/mach-s3c2440/Makefile +index e9c6334..964e50b 100644 +--- a/arch/arm/mach-s3c2440/Makefile ++++ b/arch/arm/mach-s3c2440/Makefile +@@ -1,4 +1,10 @@ +-obj-y += camera/ ++# arch/arm/mach-s3c2440/Makefile ++# ++# Copyright 2007 Simtec Electronics ++# ++# Licensed under GPLv2 ++ ++obj-y := + obj-m := + obj-n := + obj- := +@@ -17,5 +23,6 @@ obj-$(CONFIG_MACH_RX3715) += mach-rx3715.o + obj-$(CONFIG_ARCH_S3C2440) += mach-smdk2440.o + obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o + obj-$(CONFIG_MACH_AT2440EVB) += mach-at2440evb.o ++obj-$(CONFIG_MACH_HXD8) += mach-hxd8.o + obj-$(CONFIG_MACH_NEO1973_GTA02) += mach-gta02.o + +diff --git a/arch/arm/mach-s3c2440/camera/Makefile b/arch/arm/mach-s3c2440/camera/Makefile +index a46d3be..9cd6d79 100644 +--- a/arch/arm/mach-s3c2440/camera/Makefile ++++ b/arch/arm/mach-s3c2440/camera/Makefile +@@ -1,7 +1,6 @@ + obj-$(CONFIG_S3C2440_CAMERA) += \ + videodev.o \ + imgsensor.o \ +- videodrv.o \ + video-driver.o \ + camif.o \ + camif_fsm.o \ +diff --git a/arch/arm/mach-s3c2440/camera/cam_reg.h b/arch/arm/mach-s3c2440/camera/cam_reg.h +index 7247a4e..93d59b8 100644 +--- a/arch/arm/mach-s3c2440/camera/cam_reg.h ++++ b/arch/arm/mach-s3c2440/camera/cam_reg.h +@@ -7,6 +7,7 @@ + #ifndef __FIMC20_CAMERA_H__ + #define __FIMC20_CAMERA_H__ + ++extern u32 * camregs; + + #ifdef CONFIG_ARCH_S3C24A0 + #define CAM_BASE_ADD 0x48000000 +@@ -14,10 +15,23 @@ + #define CAM_BASE_ADD 0x4F000000 + #endif + ++#if ! defined(FExtr) ++#define UData(Data) ((unsigned long) (Data)) ++#define FExtr(Data, Field) \ ++ ((UData (Data) >> FShft (Field)) & FAlnMsk (Field)) ++#define FInsrt(Value, Field) \ ++ (UData (Value) << FShft (Field)) ++#define FSize(Field) ((Field) >> 16) ++#define FShft(Field) ((Field) & 0x0000FFFF) ++#define FMsk(Field) (((UData (1) << FSize (Field)) - 1) << FShft (Field)) ++#define FAlnMsk(Field) ((UData (1) << FSize (Field)) - 1) ++#define F1stBit(Field) (UData (1) << FShft (Field)) ++#define Fld(Size, Shft) (((Size) << 16) + (Shft)) ++#endif + + /* + * CAMERA IP +- * P-port is used as RGB Capturing device which including scale and crop ++ * P-port is used as RGB Capturing device which including scale and crop + * those who want to see(preview ) the image on display needs RGB image. + * + * C-port is used as YCbCr(4:2:0, 4:2:2) Capturing device which including the scale and crop +@@ -25,45 +39,45 @@ + YCBCB format not RGB + */ + +-#define CISRCFMT __REG(CAM_BASE_ADD+0x00) // RW Input Source Format +-#define CIWDOFST __REG(CAM_BASE_ADD+0x04) // Window offset register +-#define CIGCTRL __REG(CAM_BASE_ADD+0x08) // Global control register +-#define CICOYSA0 __REG(CAM_BASE_ADD+0x18) // Y 1 st frame start address +-#define CICOYSA1 __REG(CAM_BASE_ADD+0x1C) // Y 2 nd frame start address +-#define CICOYSA2 __REG(CAM_BASE_ADD+0x20) // Y 3 rd frame start address +-#define CICOYSA3 __REG(CAM_BASE_ADD+0x24) // Y 4 th frame start address +-#define CICOCBSA0 __REG(CAM_BASE_ADD+0x28) // Cb 1 st frame start address +-#define CICOCBSA1 __REG(CAM_BASE_ADD+0x2C) // Cb 2 nd frame start address +-#define CICOCBSA2 __REG(CAM_BASE_ADD+0x30) // Cb 3 rd frame start address +-#define CICOCBSA3 __REG(CAM_BASE_ADD+0x34) // Cb 4 th frame start address +-#define CICOCRSA0 __REG(CAM_BASE_ADD+0x38) // Cr 1 st frame start address +-#define CICOCRSA1 __REG(CAM_BASE_ADD+0x3C) // Cr 2 nd frame start address +-#define CICOCRSA2 __REG(CAM_BASE_ADD+0x40) // Cr 3 rd frame start address +-#define CICOCRSA3 __REG(CAM_BASE_ADD+0x44) // Cr 4 th frame start address +-#define CICOTRGFMT __REG(CAM_BASE_ADD+0x48) // Target image format of codec +-#define CICOCTRL __REG(CAM_BASE_ADD+0x4C) // Codec DMA control related +-#define CICOSCPRERATIO __REG(CAM_BASE_ADD+0x50) // Codec pre-scaler ratio control +-#define CICOSCPREDST __REG(CAM_BASE_ADD+0x54) // Codec pre-scaler destination +-#define CICOSCCTRL __REG(CAM_BASE_ADD+0x58) // Codec main-scaler control +-#define CICOTAREA __REG(CAM_BASE_ADD+0x5C) // Codec pre-scaler destination +-#define CICOSTATUS __REG(CAM_BASE_ADD+0x64) // Codec path status +-#define CIPRCLRSA0 __REG(CAM_BASE_ADD+0x6C) // RGB 1 st frame start address +-#define CIPRCLRSA1 __REG(CAM_BASE_ADD+0x70) // RGB 2 nd frame start address +-#define CIPRCLRSA2 __REG(CAM_BASE_ADD+0x74) // RGB 3 rd frame start address +-#define CIPRCLRSA3 __REG(CAM_BASE_ADD+0x78) // RGB 4 th frame start address +-#define CIPRTRGFMT __REG(CAM_BASE_ADD+0x7C) // Target image format of preview +-#define CIPRCTRL __REG(CAM_BASE_ADD+0x80) // Preview DMA control related +-#define CIPRSCPRERATIO __REG(CAM_BASE_ADD+0x84) // Preview pre-scaler ratio control +-#define CIPRSCPREDST __REG(CAM_BASE_ADD+0x88) // Preview pre-scaler destination +-#define CIPRSCCTRL __REG(CAM_BASE_ADD+0x8C) // Preview main-scaler control +-#define CIPRTAREA __REG(CAM_BASE_ADD+0x90) // Preview pre-scaler destination +-#define CIPRSTATUS __REG(CAM_BASE_ADD+0x98) // Preview path status +-#define CIIMGCPT __REG(CAM_BASE_ADD+0xA0) // Image capture enable command +- +-#define CICOYSA(__x) __REG(CAM_BASE_ADD+0x18 + (__x)*4 ) +-#define CICOCBSA(__x) __REG(CAM_BASE_ADD+0x28 + (__x)*4 ) +-#define CICOCRSA(__x) __REG(CAM_BASE_ADD+0x38 + (__x)*4 ) +-#define CIPRCLRSA(__x) __REG(CAM_BASE_ADD+0x6C + (__x)*4 ) ++#define S3C2440_CAM_REG_CISRCFMT (0x00) // RW Input Source Format ++#define S3C2440_CAM_REG_CIWDOFST (0x04) // Window offset register ++#define S3C2440_CAM_REG_CIGCTRL (0x08) // Global control register ++#define S3C2440_CAM_REG_CICOYSA0 (0x18) // Y 1 st frame start ads ++#define S3C2440_CAM_REG_CICOYSA1 (0x1C) // Y 2 nd frame start ads ++#define S3C2440_CAM_REG_CICOYSA2 (0x20) // Y 3 rd frame start ads ++#define S3C2440_CAM_REG_CICOYSA3 (0x24) // Y 4 th frame start ads ++#define S3C2440_CAM_REG_CICOCBSA0 (0x28) // Cb 1 st frame start ads ++#define S3C2440_CAM_REG_CICOCBSA1 (0x2C) // Cb 2 nd frame start ads ++#define S3C2440_CAM_REG_CICOCBSA2 (0x30) // Cb 3 rd frame start ads ++#define S3C2440_CAM_REG_CICOCBSA3 (0x34) // Cb 4 th frame start ads ++#define S3C2440_CAM_REG_CICOCRSA0 (0x38) // Cr 1 st frame start ads ++#define S3C2440_CAM_REG_CICOCRSA1 (0x3C) // Cr 2 nd frame start ads ++#define S3C2440_CAM_REG_CICOCRSA2 (0x40) // Cr 3 rd frame start ads ++#define S3C2440_CAM_REG_CICOCRSA3 (0x44) // Cr 4 th frame start ads ++#define S3C2440_CAM_REG_CICOTRGFMT (0x48) // Target img format of codec ++#define S3C2440_CAM_REG_CICOCTRL (0x4C) // Codec DMA control related ++#define S3C2440_CAM_REG_CICOSCPRERATIO (0x50) // Codec pre-scaler ratio ++#define S3C2440_CAM_REG_CICOSCPREDST (0x54) // Codec pre-scaler dest ++#define S3C2440_CAM_REG_CICOSCCTRL (0x58) // Codec main-scaler control ++#define S3C2440_CAM_REG_CICOTAREA (0x5C) // Codec pre-scaler dest ++#define S3C2440_CAM_REG_CICOSTATUS (0x64) // Codec path status ++#define S3C2440_CAM_REG_CIPRCLRSA0 (0x6C) // RGB 1 st frame start ads ++#define S3C2440_CAM_REG_CIPRCLRSA1 (0x70) // RGB 2 nd frame start ads ++#define S3C2440_CAM_REG_CIPRCLRSA2 (0x74) // RGB 3 rd frame start ads ++#define S3C2440_CAM_REG_CIPRCLRSA3 (0x78) // RGB 4 th frame start ads ++#define S3C2440_CAM_REG_CIPRTRGFMT (0x7C) // Target img fmt of preview ++#define S3C2440_CAM_REG_CIPRCTRL (0x80) // Preview DMA ctl related ++#define S3C2440_CAM_REG_CIPRSCPRERATIO (0x84) // Preview pre-scaler ratio ++#define S3C2440_CAM_REG_CIPRSCPREDST (0x88) // Preview pre-scaler dest ++#define S3C2440_CAM_REG_CIPRSCCTRL (0x8C) // Preview main-scaler ctl ++#define S3C2440_CAM_REG_CIPRTAREA (0x90) // Preview pre-scaler dest ++#define S3C2440_CAM_REG_CIPRSTATUS (0x98) // Preview path status ++#define S3C2440_CAM_REG_CIIMGCPT (0xA0) // Image capture enable cmd ++ ++#define S3C2440_CAM_REG_CICOYSA(__x) (0x18 + (__x)*4 ) ++#define S3C2440_CAM_REG_CICOCBSA(__x) (0x28 + (__x)*4 ) ++#define S3C2440_CAM_REG_CICOCRSA(__x) (0x38 + (__x)*4 ) ++#define S3C2440_CAM_REG_CIPRCLRSA(__x) (0x6C + (__x)*4 ) + + /* CISRCFMT BitField */ + #define SRCFMT_ITU601 BIT31 +diff --git a/arch/arm/mach-s3c2440/camera/camif.c b/arch/arm/mach-s3c2440/camera/camif.c +index 36d4ccc..2e97e21 100644 +--- a/arch/arm/mach-s3c2440/camera/camif.c ++++ b/arch/arm/mach-s3c2440/camera/camif.c +@@ -7,14 +7,11 @@ + * for more details. + */ + +-#include <linux/config.h> + #include <linux/module.h> + #include <linux/kernel.h> + #include <linux/init.h> + #include <linux/sched.h> + #include <linux/irq.h> +-#include <linux/tqueue.h> +-#include <linux/locks.h> + #include <linux/completion.h> + #include <linux/delay.h> + #include <linux/slab.h> +@@ -26,28 +23,29 @@ + #include <asm/semaphore.h> + #include <asm/hardware.h> + #include <asm/uaccess.h> ++#include <linux/device.h> ++#include <linux/dma-mapping.h> ++#include <linux/clk.h> + + #ifdef CONFIG_ARCH_S3C24A0A + #include <asm/arch/S3C24A0.h> + #include <asm/arch/clocks.h> + #else +-#include <asm/arch/S3C2440.h> +-#include <asm/arch/clocks.h> ++#include <asm/arch/regs-gpio.h> ++#include <asm/arch/regs-gpioj.h> ++#include <asm/arch/regs-irq.h> + #endif + + #include "cam_reg.h" + //#define SW_DEBUG ++#define CONFIG_VIDEO_V4L1_COMPAT ++#include <linux/videodev.h> + #include "camif.h" +-#include "videodev.h" + #include "miscdevice.h" + +- + static int camif_dma_burst(camif_cfg_t *); + static int camif_scaler(camif_cfg_t *); + +-static const char *camif_version = +- "$Id: camif.c,v 1.10 2004/06/04 04:24:14 swlee Exp $"; +- + /* For SXGA Image */ + #define RESERVE_MEM 15*1024*1024 + #define YUV_MEM 10*1024*1024 +@@ -66,11 +64,13 @@ static int camif_malloc(camif_cfg_t *cfg) + t_size = t_size *cfg->pp_num; + + #ifndef SAMSUNG_SXGA_CAM +- cfg->pp_virt_buf = consistent_alloc(GFP_KERNEL, t_size, &cfg->pp_phys_buf); ++ cfg->pp_virt_buf = dma_alloc_coherent(cfg->v->dev, ++ t_size, &cfg->pp_phys_buf, ++ GFP_KERNEL); + #else + printk(KERN_INFO "Reserving High RAM Addresses \n"); + cfg->pp_phys_buf = PHYS_OFFSET + (MEM_SIZE - RESERVE_MEM); +- cfg->pp_virt_buf = ioremap_nocache(cfg->pp_phys_buf,YUV_MEM); ++ cfg->pp_virt_buf = ioremap_nocache(cfg->pp_phys_buf, YUV_MEM); + #endif + + if ( !cfg->pp_virt_buf ) { +@@ -90,7 +90,9 @@ static int camif_malloc(camif_cfg_t *cfg) + } + t_size = t_size * cfg->pp_num; + #ifndef SAMSUNG_SXGA_CAM +- cfg->pp_virt_buf = consistent_alloc(GFP_KERNEL, t_size, &cfg->pp_phys_buf); ++ cfg->pp_virt_buf = dma_alloc_coherent(cfg->v->dev, ++ t_size, &cfg->pp_phys_buf, ++ GFP_KERNEL); + #else + printk(KERN_INFO "Reserving High RAM Addresses \n"); + cfg->pp_phys_buf = PHYS_OFFSET + (MEM_SIZE - RESERVE_MEM ) + YUV_MEM; +@@ -112,7 +114,8 @@ static int camif_demalloc(camif_cfg_t *cfg) + { + #ifndef SAMSUNG_SXGA_CAM + if ( cfg->pp_virt_buf ) { +- consistent_free(cfg->pp_virt_buf,cfg->pp_totalsize,cfg->pp_phys_buf); ++ dma_free_coherent(cfg->v->dev, cfg->pp_totalsize, ++ cfg->pp_virt_buf, cfg->pp_phys_buf); + cfg->pp_virt_buf = 0; + } + #else +@@ -131,13 +134,14 @@ int camif_g_frame_num(camif_cfg_t *cfg) + int index = 0; + + if (cfg->dma_type & CAMIF_CODEC ) { +- index = FRAME_CNT(CICOSTATUS); ++ index = FRAME_CNT(readl(camregs + S3C2440_CAM_REG_CICOSTATUS)); + DPRINTK("CAMIF_CODEC frame %d \n", index); + } + else { + assert(cfg->dma_type & CAMIF_PREVIEW ); +- index = FRAME_CNT(CIPRSTATUS); +- DPRINTK("CAMIF_PREVIEW frame %d 0x%08X \n", index, CIPRSTATUS); ++ index = FRAME_CNT(readl(camregs + S3C2440_CAM_REG_CIPRSTATUS)); ++ DPRINTK("CAMIF_PREVIEW frame %d 0x%08X \n", index, ++ readl(camregs + S3C2440_CAM_REG_CIPRSTATUS)); + } + cfg->now_frame_num = (index + 2) % 4; /* When 4 PingPong */ + return index; /* meaningless */ +@@ -148,60 +152,59 @@ static int camif_pp_codec(camif_cfg_t *cfg) + u32 i, c_size; /* Cb,Cr size */ + u32 one_p_size; + u32 daon = cfg->target_x * cfg->target_y; +- if (cfg->fmt & CAMIF_OUT_YCBCR420) { +- c_size = daon /4; +- } ++ if (cfg->fmt & CAMIF_OUT_YCBCR420) ++ c_size = daon / 4; + else { + assert(cfg->fmt & CAMIF_OUT_YCBCR422); +- c_size = daon /2; ++ c_size = daon / 2; + } + switch ( cfg->pp_num ) { +- case 1 : +- for ( i =0 ; i < 4; i=i+1) { +- cfg->img_buf[i].virt_y = cfg->pp_virt_buf; +- cfg->img_buf[i].phys_y = cfg->pp_phys_buf; +- cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon; +- cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon; +- cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size; +- cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size; +- CICOYSA(i) = cfg->img_buf[i].phys_y; +- CICOCBSA(i) = cfg->img_buf[i].phys_cb; +- CICOCRSA(i) = cfg->img_buf[i].phys_cr; +- } +- break; +- case 2: ++ case 1 : ++ for (i =0 ; i < 4; i++) { ++ cfg->img_buf[i].virt_y = cfg->pp_virt_buf; ++ cfg->img_buf[i].phys_y = cfg->pp_phys_buf; ++ cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon; ++ cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon; ++ cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size; ++ cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size; ++ writel(cfg->img_buf[i].phys_y, camregs + S3C2440_CAM_REG_CICOYSA(i)); ++ writel(cfg->img_buf[i].phys_cb, camregs + S3C2440_CAM_REG_CICOCBSA(i)); ++ writel(cfg->img_buf[i].phys_cr, camregs + S3C2440_CAM_REG_CICOCRSA(i)); ++ } ++ break; ++ case 2: + #define TRY (( i%2 ) ? 1 :0) +- one_p_size = daon + 2*c_size; +- for (i = 0; i < 4 ; i++) { +- cfg->img_buf[i].virt_y = cfg->pp_virt_buf + TRY * one_p_size; +- cfg->img_buf[i].phys_y = cfg->pp_phys_buf + TRY * one_p_size; +- cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon + TRY * one_p_size; +- cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon + TRY * one_p_size; +- cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size + TRY * one_p_size; +- cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size + TRY * one_p_size; +- CICOYSA(i) = cfg->img_buf[i].phys_y; +- CICOCBSA(i) = cfg->img_buf[i].phys_cb; +- CICOCRSA(i) = cfg->img_buf[i].phys_cr; +- } +- break; +- case 4: +- one_p_size = daon + 2*c_size; +- for (i = 0; i < 4 ; i++) { +- cfg->img_buf[i].virt_y = cfg->pp_virt_buf + i * one_p_size; +- cfg->img_buf[i].phys_y = cfg->pp_phys_buf + i * one_p_size; +- cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon + i * one_p_size; +- cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon + i * one_p_size; +- cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size + i * one_p_size; +- cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size + i * one_p_size; +- CICOYSA(i) = cfg->img_buf[i].phys_y; +- CICOCBSA(i) = cfg->img_buf[i].phys_cb; +- CICOCRSA(i) = cfg->img_buf[i].phys_cr; +- } +- break; +- default: +- printk("Invalid PingPong Number %d \n",cfg->pp_num); +- panic("halt\n"); +- } ++ one_p_size = daon + 2*c_size; ++ for (i = 0; i < 4 ; i++) { ++ cfg->img_buf[i].virt_y = cfg->pp_virt_buf + TRY * one_p_size; ++ cfg->img_buf[i].phys_y = cfg->pp_phys_buf + TRY * one_p_size; ++ cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon + TRY * one_p_size; ++ cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon + TRY * one_p_size; ++ cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size + TRY * one_p_size; ++ cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size + TRY * one_p_size; ++ writel(cfg->img_buf[i].phys_y, camregs + S3C2440_CAM_REG_CICOYSA(i)); ++ writel(cfg->img_buf[i].phys_cb, camregs + S3C2440_CAM_REG_CICOCBSA(i)); ++ writel(cfg->img_buf[i].phys_cr, camregs + S3C2440_CAM_REG_CICOCRSA(i)); ++ } ++ break; ++ case 4: ++ one_p_size = daon + 2*c_size; ++ for (i = 0; i < 4 ; i++) { ++ cfg->img_buf[i].virt_y = cfg->pp_virt_buf + i * one_p_size; ++ cfg->img_buf[i].phys_y = cfg->pp_phys_buf + i * one_p_size; ++ cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon + i * one_p_size; ++ cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon + i * one_p_size; ++ cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size + i * one_p_size; ++ cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size + i * one_p_size; ++ writel(cfg->img_buf[i].phys_y, camregs + S3C2440_CAM_REG_CICOYSA(i)); ++ writel(cfg->img_buf[i].phys_cb, camregs + S3C2440_CAM_REG_CICOCBSA(i)); ++ writel(cfg->img_buf[i].phys_cr, camregs + S3C2440_CAM_REG_CICOCRSA(i)); ++ } ++ break; ++ default: ++ printk("Invalid PingPong Number %d \n",cfg->pp_num); ++ panic("halt\n"); ++} + return 0; + } + +@@ -222,21 +225,21 @@ static int camif_pp_preview(camif_cfg_t *cfg) + for ( i = 0; i < 4 ; i++ ) { + cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf ; + cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf ; +- CIPRCLRSA(i) = cfg->img_buf[i].phys_rgb; ++ writel(cfg->img_buf[i].phys_rgb, camregs + S3C2440_CAM_REG_CICOCRSA(i)); + } + break; + case 2: + for ( i = 0; i < 4 ; i++) { + cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf + TRY * daon; + cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf + TRY * daon; +- CIPRCLRSA(i) = cfg->img_buf[i].phys_rgb; ++ writel(cfg->img_buf[i].phys_rgb, camregs + S3C2440_CAM_REG_CICOCRSA(i)); + } + break; + case 4: + for ( i = 0; i < 4 ; i++) { + cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf + i * daon; + cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf + i * daon; +- CIPRCLRSA(i) = cfg->img_buf[i].phys_rgb; ++ writel(cfg->img_buf[i].phys_rgb, camregs + S3C2440_CAM_REG_CICOCRSA(i)); + } + break; + default: +@@ -308,7 +311,7 @@ static int camif_source_fmt(camif_gc_t *gc) + cmd |= SOURCE_HSIZE(gc->source_x)| SOURCE_VSIZE(gc->source_y); + /* Order422 */ + cmd |= gc->order422; +- CISRCFMT = cmd; ++ writel(cmd, camregs + S3C2440_CAM_REG_CISRCFMT); + + return 0 ; + } +@@ -331,33 +334,24 @@ static int camif_target_fmt(camif_cfg_t *cfg) + assert(cfg->fmt & CAMIF_OUT_YCBCR422); + cmd |= OUT_YCBCR422|IN_YCBCR422; + } +- CICOTRGFMT = cmd | cfg->flip; +- } +- else { ++ writel(cmd | cfg->flip, camregs + S3C2440_CAM_REG_CICOTRGFMT); ++ ++ } else { + assert(cfg->dma_type & CAMIF_PREVIEW); +- CIPRTRGFMT = +- TARGET_HSIZE(cfg->target_x)|TARGET_VSIZE(cfg->target_y)|cfg->flip; ++ writel(TARGET_HSIZE(cfg->target_x)|TARGET_VSIZE(cfg->target_y)|cfg->flip, ++ camregs + S3C2440_CAM_REG_CIPRTRGFMT); + } + return 0; + } + + void camif_change_flip(camif_cfg_t *cfg) + { +- u32 cmd = 0; ++ u32 cmd = readl(camregs + S3C2440_CAM_REG_CICOTRGFMT); + +- if (cfg->dma_type & CAMIF_CODEC ) { +- /* YCBCR setting */ +- cmd = CICOTRGFMT; +- cmd &= ~(BIT14|BIT15); /* Clear FLIP Mode */ +- cmd |= cfg->flip; +- CICOTRGFMT = cmd; +- } +- else { +- cmd = CIPRTRGFMT; +- cmd &= ~(BIT14|BIT15); +- cmd |= cfg->flip; +- CICOTRGFMT = cmd; +- } ++ cmd &= ~(BIT14|BIT15); ++ cmd |= cfg->flip; ++ ++ writel(cmd, camregs + S3C2440_CAM_REG_CICOTRGFMT); + } + + +@@ -373,70 +367,81 @@ int camif_capture_start(camif_cfg_t *cfg) + u32 n_cmd = 0; /* Next Command */ + + switch(cfg->exec) { +- case CAMIF_BOTH_DMA_ON: +- camif_reset(CAMIF_RESET,0); /* Flush Camera Core Buffer */ +- CIPRSCCTRL |= SCALERSTART; +- CICOSCCTRL |= SCALERSTART; +- n_cmd = CAMIF_CAP_PREVIEW_ON|CAMIF_CAP_CODEC_ON; +- break; +- case CAMIF_DMA_ON: +- camif_reset(CAMIF_RESET,0); /* Flush Camera Core Buffer */ +- if (cfg->dma_type&CAMIF_CODEC) { +- CICOSCCTRL |= SCALERSTART; +- n_cmd = CAMIF_CAP_CODEC_ON; +- }else { +- CIPRSCCTRL |= SCALERSTART; +- n_cmd = CAMIF_CAP_PREVIEW_ON; +- } ++ case CAMIF_BOTH_DMA_ON: ++ camif_reset(CAMIF_RESET, 0); /* Flush Camera Core Buffer */ ++ writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) | ++ SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL); ++ writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) | ++ SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL); ++ n_cmd = CAMIF_CAP_PREVIEW_ON | CAMIF_CAP_CODEC_ON; ++ break; ++ case CAMIF_DMA_ON: ++ camif_reset(CAMIF_RESET, 0); /* Flush Camera Core Buffer */ ++ if (cfg->dma_type&CAMIF_CODEC) { ++ writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) | ++ SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL); ++ n_cmd = CAMIF_CAP_CODEC_ON; ++ } else { ++ writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) | ++ SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL); ++ n_cmd = CAMIF_CAP_PREVIEW_ON; ++ } + +- /* wait until Sync Time expires */ +- /* First settting, to wait VSYNC fall */ +- /* By VESA spec,in 640x480 @60Hz +- MAX Delay Time is around 64us which "while" has.*/ +- while(VSYNC & CICOSTATUS); +- break; +- default: +- break; +- } +- CIIMGCPT = n_cmd|CAMIF_CAP_ON; ++ /* wait until Sync Time expires */ ++ /* First settting, to wait VSYNC fall */ ++ /* By VESA spec,in 640x480 @60Hz ++ MAX Delay Time is around 64us which "while" has.*/ ++ while(VSYNC & readl(camregs + S3C2440_CAM_REG_CICOSTATUS)); ++ break; ++ default: ++ break; ++} ++ writel(n_cmd | CAMIF_CAP_ON, camregs + S3C2440_CAM_REG_CIIMGCPT); + return 0; + } + + + int camif_capture_stop(camif_cfg_t *cfg) + { +- u32 n_cmd = CIIMGCPT; /* Next Command */ ++ u32 n_cmd = readl(camregs + S3C2440_CAM_REG_CIIMGCPT); /* Next Command */ + + switch(cfg->exec) { +- case CAMIF_BOTH_DMA_OFF: +- CIPRSCCTRL &= ~SCALERSTART; +- CICOSCCTRL &= ~SCALERSTART; +- n_cmd = 0; +- break; +- case CAMIF_DMA_OFF_L_IRQ: /* fall thru */ +- case CAMIF_DMA_OFF: +- if (cfg->dma_type&CAMIF_CODEC) { +- CICOSCCTRL &= ~SCALERSTART; +- n_cmd &= ~CAMIF_CAP_CODEC_ON; +- if (!(n_cmd & CAMIF_CAP_PREVIEW_ON)) +- n_cmd = 0; +- }else { +- CIPRSCCTRL &= ~SCALERSTART; +- n_cmd &= ~CAMIF_CAP_PREVIEW_ON; +- if (!(n_cmd & CAMIF_CAP_CODEC_ON)) +- n_cmd = 0; +- } +- break; +- default: +- panic("Unexpected \n"); +- } +- CIIMGCPT = n_cmd; +- if(cfg->exec == CAMIF_DMA_OFF_L_IRQ) { /* Last IRQ */ +- if (cfg->dma_type & CAMIF_CODEC) +- CICOCTRL |= LAST_IRQ_EN; +- else +- CIPRCTRL |= LAST_IRQ_EN; +- } ++ case CAMIF_BOTH_DMA_OFF: ++ writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) & ++ ~SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL); ++ writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) & ++ ~SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL); ++ n_cmd = 0; ++ break; ++ case CAMIF_DMA_OFF_L_IRQ: /* fall thru */ ++ case CAMIF_DMA_OFF: ++ if (cfg->dma_type&CAMIF_CODEC) { ++ writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) & ++ ~SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL); ++ n_cmd &= ~CAMIF_CAP_CODEC_ON; ++ if (!(n_cmd & CAMIF_CAP_PREVIEW_ON)) ++ n_cmd = 0; ++ } else { ++ writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) & ++ ~SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL); ++ n_cmd &= ~CAMIF_CAP_PREVIEW_ON; ++ if (!(n_cmd & CAMIF_CAP_CODEC_ON)) ++ n_cmd = 0; ++ } ++ break; ++ default: ++ panic("Unexpected \n"); ++ } ++ writel(n_cmd, camregs + S3C2440_CAM_REG_CIIMGCPT); ++ ++ if (cfg->exec == CAMIF_DMA_OFF_L_IRQ) { /* Last IRQ */ ++ if (cfg->dma_type & CAMIF_CODEC) ++ writel(readl(camregs + S3C2440_CAM_REG_CICOCTRL) | ++ LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CICOCTRL); ++ else ++ writel(readl(camregs + S3C2440_CAM_REG_CIPRCTRL) | ++ LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CIPRCTRL); ++ } + #if 0 + else { /* to make internal state machine of CAMERA stop */ + camif_reset(CAMIF_RESET, 0); +@@ -449,16 +454,13 @@ int camif_capture_stop(camif_cfg_t *cfg) + /* LastIRQEn is autoclear */ + void camif_last_irq_en(camif_cfg_t *cfg) + { +- if(cfg->exec == CAMIF_BOTH_DMA_ON) { +- CIPRCTRL |= LAST_IRQ_EN; +- CICOCTRL |= LAST_IRQ_EN; +- } +- else { +- if (cfg->dma_type & CAMIF_CODEC) +- CICOCTRL |= LAST_IRQ_EN; +- else +- CIPRCTRL |= LAST_IRQ_EN; +- } ++ if ((cfg->exec == CAMIF_BOTH_DMA_ON) || (cfg->dma_type & CAMIF_CODEC)) ++ writel(readl(camregs + S3C2440_CAM_REG_CICOCTRL) | ++ LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CICOCTRL); ++ ++ if ((cfg->exec == CAMIF_BOTH_DMA_ON) || !(cfg->dma_type & CAMIF_CODEC)) ++ writel(readl(camregs + S3C2440_CAM_REG_CIPRCTRL) | ++ LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CIPRCTRL); + } + + static int +@@ -502,23 +504,33 @@ int camif_g_fifo_status(camif_cfg_t *cfg) + u32 reg; + + if (cfg->dma_type & CAMIF_CODEC) { +- u32 flag = CO_OVERFLOW_Y|CO_OVERFLOW_CB|CO_OVERFLOW_CR; +- reg = CICOSTATUS; ++ u32 flag = CO_OVERFLOW_Y | CO_OVERFLOW_CB | CO_OVERFLOW_CR; ++ reg = readl(camregs + S3C2440_CAM_REG_CICOSTATUS); + if (reg & flag) { + printk("CODEC: FIFO error(0x%08x) and corrected\n",reg); + /* FIFO Error Count ++ */ +- CIWDOFST |= CO_FIFO_Y|CO_FIFO_CB|CO_FIFO_CR; +- CIWDOFST &= ~(CO_FIFO_Y|CO_FIFO_CB|CO_FIFO_CR); ++ writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) | ++ CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR, ++ camregs + S3C2440_CAM_REG_CIWDOFST); ++ ++ writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) & ++ ~(CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR), ++ camregs + S3C2440_CAM_REG_CIWDOFST); + return 1; /* Error */ + } + } + if (cfg->dma_type & CAMIF_PREVIEW) { +- u32 flag = PR_OVERFLOW_CB|PR_OVERFLOW_CR; +- reg = CIPRSTATUS; ++ u32 flag = PR_OVERFLOW_CB | PR_OVERFLOW_CR; ++ reg = readl(camregs + S3C2440_CAM_REG_CIPRSTATUS); + if (reg & flag) { + printk("PREVIEW:FIFO error(0x%08x) and corrected\n",reg); +- CIWDOFST |= PR_FIFO_CB|PR_FIFO_CR; +- CIWDOFST &= ~(CO_FIFO_Y|CO_FIFO_CB|CO_FIFO_CR); ++ writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) | ++ CO_FIFO_CB | CO_FIFO_CR, ++ camregs + S3C2440_CAM_REG_CIWDOFST); ++ ++ writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) & ++ ~(CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR), ++ camregs + S3C2440_CAM_REG_CIWDOFST); + /* FIFO Error Count ++ */ + return 1; /* Error */ + } +@@ -537,13 +549,16 @@ int camif_win_offset(camif_gc_t *gc ) + u32 v = gc->win_ver_ofst; + + /*Clear Overflow */ +- CIWDOFST = CO_FIFO_Y|CO_FIFO_CB|CO_FIFO_CR|PR_FIFO_CB|PR_FIFO_CB; +- CIWDOFST = 0; /* ? Dummy */ ++ writel(CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR | PR_FIFO_CB | PR_FIFO_CB, ++ camregs + S3C2440_CAM_REG_CIWDOFST); ++ writel(0, camregs + S3C2440_CAM_REG_CIWDOFST); ++ + if (!h && !v) { +- CIWDOFST = 0; ++ writel(0, camregs + S3C2440_CAM_REG_CIWDOFST); + return 0; + } +- CIWDOFST = WINOFEN | WINHOROFST(h) | WINVEROFST(v); ++ ++ writel(WINOFEN | WINHOROFST(h) | WINVEROFST(v), camregs + S3C2440_CAM_REG_CIWDOFST); + return 0; + } + +@@ -554,7 +569,7 @@ int camif_win_offset(camif_gc_t *gc ) + */ + static void camif_polarity(camif_gc_t *gc) + { +- u32 cmd = CIGCTRL; ++ u32 cmd = readl(camregs + S3C2440_CAM_REG_CIGCTRL);; + + cmd = cmd & ~(BIT26|BIT25|BIT24); /* clear polarity */ + if (gc->polarity_pclk) +@@ -563,7 +578,8 @@ static void camif_polarity(camif_gc_t *gc) + cmd |= GC_INVPOLVSYNC; + if (gc->polarity_href) + cmd |= GC_INVPOLHREF; +- CIGCTRL |= cmd; ++ writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) | ++ cmd, camregs + S3C2440_CAM_REG_CIGCTRL); + } + + +@@ -599,12 +615,13 @@ int camif_dynamic_close(camif_cfg_t *cfg) + static int camif_target_area(camif_cfg_t *cfg) + { + u32 rect = cfg->target_x * cfg->target_y; +- if (cfg->dma_type & CAMIF_CODEC ) { +- CICOTAREA = rect; +- } +- if (cfg->dma_type & CAMIF_PREVIEW) { +- CIPRTAREA = rect; +- } ++ ++ if (cfg->dma_type & CAMIF_CODEC) ++ writel(rect, camregs + S3C2440_CAM_REG_CICOTAREA); ++ ++ if (cfg->dma_type & CAMIF_PREVIEW) ++ writel(rect, camregs + S3C2440_CAM_REG_CIPRTAREA); ++ + return 0; + } + +@@ -613,40 +630,44 @@ static int inline camif_hw_reg(camif_cfg_t *cfg) + u32 cmd = 0; + + if (cfg->dma_type & CAMIF_CODEC) { +- CICOSCPRERATIO = PRE_SHIFT(cfg->sc.shfactor) +- |PRE_HRATIO(cfg->sc.prehratio)|PRE_VRATIO(cfg->sc.prevratio); +- CICOSCPREDST = +- PRE_DST_WIDTH(cfg->sc.predst_x)|PRE_DST_HEIGHT(cfg->sc.predst_y); ++ writel(PRE_SHIFT(cfg->sc.shfactor) | ++ PRE_HRATIO(cfg->sc.prehratio) | ++ PRE_VRATIO(cfg->sc.prevratio), ++ camregs + S3C2440_CAM_REG_CICOSCPRERATIO); ++ writel(PRE_DST_WIDTH(cfg->sc.predst_x) | ++ PRE_DST_HEIGHT(cfg->sc.predst_y), ++ camregs + S3C2440_CAM_REG_CICOSCPREDST); + + /* Differ from Preview */ + if (cfg->sc.scalerbypass) + cmd |= SCALERBYPASS; + if (cfg->sc.scaleup_h & cfg->sc.scaleup_v) + cmd |= BIT30|BIT29; +- CICOSCCTRL = cmd | MAIN_HRATIO(cfg->sc.mainhratio) +- |MAIN_VRATIO(cfg->sc.mainvratio); ++ writel(cmd | MAIN_HRATIO(cfg->sc.mainhratio) | ++ MAIN_VRATIO(cfg->sc.mainvratio), ++ camregs + S3C2440_CAM_REG_CICOSCCTRL); + return 0; + } +- else if (cfg->dma_type & CAMIF_PREVIEW) { +- CIPRSCPRERATIO = PRE_SHIFT(cfg->sc.shfactor) +- |PRE_HRATIO(cfg->sc.prehratio)|PRE_VRATIO(cfg->sc.prevratio); +- CIPRSCPREDST = +- PRE_DST_WIDTH(cfg->sc.predst_x)|PRE_DST_HEIGHT(cfg->sc.predst_y); ++ if (cfg->dma_type & CAMIF_PREVIEW) { ++ writel(PRE_SHIFT(cfg->sc.shfactor) | ++ PRE_HRATIO(cfg->sc.prehratio) | ++ PRE_VRATIO(cfg->sc.prevratio), ++ camregs + S3C2440_CAM_REG_CIPRSCPRERATIO); ++ writel(PRE_DST_WIDTH(cfg->sc.predst_x) | ++ PRE_DST_HEIGHT(cfg->sc.predst_y), ++ camregs + S3C2440_CAM_REG_CIPRSCPREDST); + /* Differ from Codec */ +- if (cfg->fmt & CAMIF_RGB24) { ++ if (cfg->fmt & CAMIF_RGB24) + cmd |= RGB_FMT24; +- } +- else { +- /* RGB16 */; +- } + if (cfg->sc.scaleup_h & cfg->sc.scaleup_v) +- cmd |= BIT29|BIT28; +- CIPRSCCTRL = cmd |MAIN_HRATIO(cfg->sc.mainhratio)|S_METHOD +- |MAIN_VRATIO(cfg->sc.mainvratio); +- }else { +- panic("CAMERA:DMA_TYPE Wrong \n"); ++ cmd |= BIT29 | BIT28; ++ writel(cmd | MAIN_HRATIO(cfg->sc.mainhratio) | S_METHOD | ++ MAIN_VRATIO(cfg->sc.mainvratio), ++ camregs + S3C2440_CAM_REG_CIPRSCCTRL); ++ return 0; + } + ++ panic("CAMERA:DMA_TYPE Wrong \n"); + return 0; + } + +@@ -654,46 +675,50 @@ static int inline camif_hw_reg(camif_cfg_t *cfg) + /* Configure Pre-scaler control & main scaler control register */ + static int camif_scaler(camif_cfg_t *cfg) + { +- int tx = cfg->target_x,ty=cfg->target_y; ++ int tx = cfg->target_x, ty = cfg->target_y; + int sx, sy; + +- if (tx <= 0 || ty<= 0) panic("CAMERA: Invalid target size \n"); ++ if (tx <= 0 || ty <= 0) ++ panic("CAMERA: Invalid target size \n"); ++ ++ sx = cfg->gc->source_x - 2 * cfg->gc->win_hor_ofst; ++ sy = cfg->gc->source_y - 2 * cfg->gc->win_ver_ofst; ++ if (sx <= 0 || sy <= 0) ++ panic("CAMERA: Invalid source size \n"); + +- sx = cfg->gc->source_x - 2*cfg->gc->win_hor_ofst; +- sy = cfg->gc->source_y - 2*cfg->gc->win_ver_ofst; +- if (sx <= 0 || sy<= 0) panic("CAMERA: Invalid source size \n"); + cfg->sc.modified_src_x = sx; + cfg->sc.modified_src_y = sy; + + /* Pre-scaler control register 1 */ +- camif_scaler_internal(sx,tx,&cfg->sc.prehratio,&cfg->sc.hfactor); +- camif_scaler_internal(sy,ty,&cfg->sc.prevratio,&cfg->sc.vfactor); ++ camif_scaler_internal(sx, tx, &cfg->sc.prehratio, &cfg->sc.hfactor); ++ camif_scaler_internal(sy, ty, &cfg->sc.prevratio, &cfg->sc.vfactor); + +- if (cfg->dma_type & CAMIF_PREVIEW) { +- if ( (sx /cfg->sc.prehratio) <= 640 ) {} +- else { +- printk(KERN_INFO "CAMERA: Internal Preview line buffer is 640 pixels\n"); ++ if (cfg->dma_type & CAMIF_PREVIEW) ++ if ((sx / cfg->sc.prehratio) > 640) { ++ printk(KERN_INFO "CAMERA: Internal Preview line " ++ "buffer is 640 pixels\n"); + return 1; /* Error */ + } +- } + +- cfg->sc.shfactor = 10-(cfg->sc.hfactor+cfg->sc.vfactor); ++ cfg->sc.shfactor = 10 - (cfg->sc.hfactor + cfg->sc.vfactor); + /* Pre-scaler control register 2 */ + cfg->sc.predst_x = sx / cfg->sc.prehratio; + cfg->sc.predst_y = sy / cfg->sc.prevratio; + + /* Main-scaler control register */ +- cfg->sc.mainhratio = (sx << 8)/(tx << cfg->sc.hfactor); +- cfg->sc.mainvratio = (sy << 8)/(ty << cfg->sc.vfactor); +- DPRINTK(" sx %d, sy %d tx %d ty %d \n",sx,sy,tx,ty); +- DPRINTK(" hfactor %d vfactor %d \n",cfg->sc.hfactor,cfg->sc.vfactor); ++ cfg->sc.mainhratio = (sx << 8) / (tx << cfg->sc.hfactor); ++ cfg->sc.mainvratio = (sy << 8) / (ty << cfg->sc.vfactor); ++ DPRINTK(" sx %d, sy %d tx %d ty %d \n", sx, sy, tx, ty); ++ DPRINTK(" hfactor %d vfactor %d \n",cfg->sc.hfactor, cfg->sc.vfactor); + + cfg->sc.scaleup_h = (sx <= tx) ? 1: 0; + cfg->sc.scaleup_v = (sy <= ty) ? 1: 0; +- if ( cfg->sc.scaleup_h != cfg->sc.scaleup_v) ++ if (cfg->sc.scaleup_h != cfg->sc.scaleup_v) + printk(KERN_ERR "scaleup_h must be same to scaleup_v \n"); ++ + camif_hw_reg(cfg); + camif_target_area(cfg); ++ + return 0; + } + +@@ -706,38 +731,38 @@ static void camif_g_bsize(u32 hsize, u32 *mburst, u32 *rburst) + { + u32 tmp; + +- tmp = (hsize/4) % 16; ++ tmp = (hsize / 4) % 16; + switch(tmp) { ++ case 0: ++ *mburst=16; ++ *rburst=16; ++ break; ++ case 4: ++ *mburst=16; ++ *rburst=4; ++ break; ++ case 8: ++ *mburst=16; ++ *rburst=8; ++ break; ++ default: ++ tmp=(hsize / 4) % 8; ++ switch(tmp) { + case 0: +- *mburst=16; +- *rburst=16; ++ *mburst = 8; ++ *rburst = 8; + break; + case 4: +- *mburst=16; +- *rburst=4; +- break; +- case 8: +- *mburst=16; +- *rburst=8; +- break; ++ *mburst = 8; ++ *rburst = 4; + default: +- tmp=(hsize/4)%8; +- switch(tmp) { +- case 0: +- *mburst=8; +- *rburst=8; +- break; +- case 4: +- *mburst=8; +- *rburst=4; +- default: +- *mburst=4; +- tmp=(hsize/4)%4; +- *rburst= (tmp) ? tmp: 4; +- break; +- } ++ *mburst = 4; ++ tmp = (hsize / 4) % 4; ++ *rburst= (tmp) ? tmp: 4; + break; + } ++ break; ++ } + } + + /* SXGA 1028x1024*/ +@@ -759,24 +784,30 @@ static int camif_dma_burst(camif_cfg_t *cfg) + u32 yburst_m, yburst_r; + u32 cburst_m, cburst_r; + /* CODEC DMA WIDHT is multiple of 16 */ +- if (width %16 != 0 ) return BURST_ERR; /* DMA Burst Length Error */ +- camif_g_bsize(width,&yburst_m,&yburst_r); +- camif_g_bsize(width/2,&cburst_m,&cburst_r); +- CICOCTRL =YBURST_M(yburst_m)|CBURST_M(cburst_m) +- |YBURST_R(yburst_r)|CBURST_R(cburst_r); ++ if (width % 16) ++ return BURST_ERR; /* DMA Burst Length Error */ ++ camif_g_bsize(width, &yburst_m, &yburst_r); ++ camif_g_bsize(width / 2, &cburst_m, &cburst_r); ++ ++ writel(YBURST_M(yburst_m) | CBURST_M(cburst_m) | ++ YBURST_R(yburst_r) | CBURST_R(cburst_r), ++ camregs + S3C2440_CAM_REG_CICOCTRL); + } + + if (cfg->dma_type & CAMIF_PREVIEW) { + u32 rgburst_m, rgburst_r; + if(cfg->fmt == CAMIF_RGB24) { +- if (width %2 != 0 ) return BURST_ERR; /* DMA Burst Length Error */ ++ if (width % 2) ++ return BURST_ERR; /* DMA Burst Length Error */ + camif_g_bsize(width*4,&rgburst_m,&rgburst_r); +- } +- else { /* CAMIF_RGB16 */ +- if ((width/2) %2 != 0 ) return BURST_ERR; /* DMA Burst Length Error */ ++ } else { /* CAMIF_RGB16 */ ++ if ((width / 2) %2) ++ return BURST_ERR; /* DMA Burst Length Error */ + camif_g_bsize(width*2,&rgburst_m,&rgburst_r); + } +- CIPRCTRL = RGBURST_M(rgburst_m) | RGBURST_R(rgburst_r); ++ ++ writel(RGBURST_M(rgburst_m) | RGBURST_R(rgburst_r), ++ camregs + S3C2440_CAM_REG_CIPRCTRL); + } + return 0; + } +@@ -786,19 +817,20 @@ static int camif_gpio_init(void) + #ifdef CONFIG_ARCH_S3C24A0A + /* S3C24A0A has the dedicated signal pins for Camera */ + #else +- set_gpio_ctrl(GPIO_CAMDATA0); +- set_gpio_ctrl(GPIO_CAMDATA1); +- set_gpio_ctrl(GPIO_CAMDATA2); +- set_gpio_ctrl(GPIO_CAMDATA3); +- set_gpio_ctrl(GPIO_CAMDATA4); +- set_gpio_ctrl(GPIO_CAMDATA5); +- set_gpio_ctrl(GPIO_CAMDATA6); +- set_gpio_ctrl(GPIO_CAMDATA7); +- set_gpio_ctrl(GPIO_CAMPCLKIN); +- set_gpio_ctrl(GPIO_CAMVSYNC); +- set_gpio_ctrl(GPIO_CAMHREF); +- set_gpio_ctrl(GPIO_CAMPCLKOUT); +- set_gpio_ctrl(GPIO_CAMRESET); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ0, S3C2440_GPJ0_CAMDATA0); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ1, S3C2440_GPJ1_CAMDATA1); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ2, S3C2440_GPJ2_CAMDATA2); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ3, S3C2440_GPJ3_CAMDATA3); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ4, S3C2440_GPJ4_CAMDATA4); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ5, S3C2440_GPJ5_CAMDATA5); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ6, S3C2440_GPJ6_CAMDATA6); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ7, S3C2440_GPJ7_CAMDATA7); ++ ++ s3c2410_gpio_cfgpin(S3C2440_GPJ8, S3C2440_GPJ8_CAMPCLK); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ9, S3C2440_GPJ9_CAMVSYNC); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ10, S3C2440_GPJ10_CAMHREF); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ11, S3C2440_GPJ11_CAMCLKOUT); ++ s3c2410_gpio_cfgpin(S3C2440_GPJ12, S3C2440_GPJ12_CAMRESET); + #endif + return 0; + } +@@ -827,21 +859,33 @@ int camif_clock_init(camif_gc_t *gc) + camclk_div = (upll+ROUND_ADD) / camclk - 1; + CLKDIVN = (CLKDIVN & 0xFF) | CLKDIVN_CAM(camclk_div); + printk(KERN_INFO"CAMERA:upll %d MACRO 0x%08X CLKDIVN 0x%08X \n", +- upll, CLKDIVN_CAM(camclk_div),CLKDIVN); +- CIIMGCPT = 0; /* Dummy ? */ ++ upll, CLKDIVN_CAM(camclk_div), CLKDIVN); ++ writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT); /* Dummy ? */ ++ + return 0; + } + #else + int camif_clock_init(camif_gc_t *gc) + { +- unsigned int upll, camclk_div, camclk; +- if (!gc) camclk = 24000000; +- else { ++ unsigned int camclk; ++ struct clk *clk_camif = clk_get(NULL, "camif"); ++ struct clk *clk_camif_upll = clk_get(NULL, "camif-upll"); ++ ++ if (!gc) ++ camclk = 24000000; ++ else { + camclk = gc->camclk; + if (camclk > 48000000) + printk(KERN_ERR "Wrong Camera Clock\n"); + } + ++ clk_set_rate(clk_camif, camclk); ++ ++ clk_enable(clk_camif); ++ clk_enable(clk_camif_upll); ++ ++ ++#if 0 + CLKCON |= CLKCON_CAMIF; + upll = elfin_get_bus_clk(GET_UPLL); + printk(KERN_INFO "CAMERA:Default UPLL %08d and Assing 96Mhz to UPLL\n",upll); +@@ -854,7 +898,9 @@ int camif_clock_init(camif_gc_t *gc) + camclk_div = (upll+ROUND_ADD) /(camclk * 2) -1; + CAMDIVN = CAMCLK_SET_DIV|(camclk_div&0xf); + printk(KERN_INFO "CAMERA:upll %08d cam_clk %08d CAMDIVN 0x%08x \n",upll,camclk, CAMDIVN); +- CIIMGCPT = 0; /* Dummy ? */ ++#endif ++ writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT); /* Dummy ? */ ++ + return 0; + } + #endif +@@ -867,23 +913,39 @@ void camif_reset(int is, int delay) + { + switch (is) { + case CAMIF_RESET: +- CIGCTRL |= GC_SWRST; ++ writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) | ++ GC_SWRST, ++ camregs + S3C2440_CAM_REG_CIGCTRL); + mdelay(1); +- CIGCTRL &= ~GC_SWRST; ++ writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) & ++ ~GC_SWRST, ++ camregs + S3C2440_CAM_REG_CIGCTRL); + break; + case CAMIF_EX_RESET_AH: /*Active High */ +- CIGCTRL &= ~GC_CAMRST; ++ writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) & ++ ~GC_CAMRST, ++ camregs + S3C2440_CAM_REG_CIGCTRL); + udelay(200); +- CIGCTRL |= GC_CAMRST; ++ writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) | ++ GC_CAMRST, ++ camregs + S3C2440_CAM_REG_CIGCTRL); + udelay(delay); +- CIGCTRL &= ~GC_CAMRST; ++ writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) & ++ ~GC_CAMRST, ++ camregs + S3C2440_CAM_REG_CIGCTRL); + break; + case CAMIF_EX_RESET_AL: /*Active Low */ +- CIGCTRL |= GC_CAMRST; ++ writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) | ++ GC_CAMRST, ++ camregs + S3C2440_CAM_REG_CIGCTRL); + udelay(200); +- CIGCTRL &= ~GC_CAMRST; ++ writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) & ++ ~GC_CAMRST, ++ camregs + S3C2440_CAM_REG_CIGCTRL); + udelay(delay); +- CIGCTRL |= GC_CAMRST; ++ writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) | ++ GC_CAMRST, ++ camregs + S3C2440_CAM_REG_CIGCTRL); + break; + default: + break; +@@ -908,10 +970,10 @@ static void camif_bus_priority(int flag) + PRIORITY1 = PRIORITY_I_FIX; + + #else +- old_priority = PRIORITY; +- PRIORITY &= ~(3<<7); +- PRIORITY |= (1<<7); /* Arbiter 1, REQ2 first */ +- PRIORITY &= ~(1<<1); /* Disable Priority Rotate */ ++ old_priority = readl(S3C2410_PRIORITY); ++ writel(readl(S3C2410_PRIORITY) & ~(3<<7), S3C2410_PRIORITY); ++ writel(readl(S3C2410_PRIORITY) | (1<<7), S3C2410_PRIORITY); /* Arbiter 1, REQ2 first */ ++ writel(readl(S3C2410_PRIORITY) & ~(1<<1), S3C2410_PRIORITY); /* Disable Priority Rotate */ + #endif + } + else { +@@ -919,19 +981,26 @@ static void camif_bus_priority(int flag) + PRIORITY0 = old_priority; + PRIORITY1 = old_priority; + #else +- PRIORITY = old_priority; ++ writel(old_priority, S3C2410_PRIORITY); + #endif + } + } + + static void inline camif_clock_off(void) + { +- CIIMGCPT = 0; + #if defined (CONFIG_ARCH_S3C24A0A) ++ writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT); ++ + CLKCON &= ~CLKCON_CAM_UPLL; + CLKCON &= ~CLKCON_CAM_HCLK; + #else +- CLKCON &= ~CLKCON_CAMIF; ++ struct clk *clk_camif = clk_get(NULL, "camif"); ++ struct clk *clk_camif_upll = clk_get(NULL, "camif-upll"); ++ ++ writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT); ++ ++ clk_disable(clk_camif); ++ clk_disable(clk_camif_upll); + #endif + } + +diff --git a/arch/arm/mach-s3c2440/camera/camif_fsm.c b/arch/arm/mach-s3c2440/camera/camif_fsm.c +index 3e2b71a..b534aca 100644 +--- a/arch/arm/mach-s3c2440/camera/camif_fsm.c ++++ b/arch/arm/mach-s3c2440/camera/camif_fsm.c +@@ -31,7 +31,12 @@ + #include <asm/semaphore.h> + #include <linux/miscdevice.h> + ++#define CONFIG_VIDEO_V4L1_COMPAT ++#include <linux/videodev.h> ++#include "camif.h" ++ + //#define SW_DEBUG ++static void camif_start_p_with_c(camif_cfg_t *cfg); + + #include "camif.h" + const char *fsm_version = +diff --git a/arch/arm/mach-s3c2440/camera/imgsensor.c b/arch/arm/mach-s3c2440/camera/imgsensor.c +index 44b7bee..2099b69 100644 +--- a/arch/arm/mach-s3c2440/camera/imgsensor.c ++++ b/arch/arm/mach-s3c2440/camera/imgsensor.c +@@ -11,7 +11,7 @@ + * Driver for FIMC20 Camera Decoder + */ + +-#include <linux/config.h> ++ + #include <linux/module.h> + #include <linux/kernel.h> + #include <linux/init.h> +@@ -24,10 +24,12 @@ + + #ifdef CONFIG_ARCH_S3C24A0A + #else +-#include <asm/arch/S3C2440.h> ++//#include <asm/arch/S3C2440.h> + #endif + + #define SW_DEBUG ++#define CONFIG_VIDEO_V4L1_COMPAT ++#include <linux/videodev.h> + #include "camif.h" + #include "sensor.h" + +@@ -37,10 +39,6 @@ + #include "sxga.h" + #endif + +-static const char *sensor_version = +- "$Id: imgsensor.c,v 1.11 2004/06/10 12:45:40 swlee Exp $"; +- +- + static struct i2c_driver s5x532_driver; + static camif_gc_t data = { + itu_fmt: CAMIF_ITU601, +@@ -69,22 +67,18 @@ static camif_gc_t data = { + + #define CAM_ID 0x5a + +-static unsigned short ignore[] = { I2C_CLIENT_END }; ++static unsigned short ignore = I2C_CLIENT_END; + static unsigned short normal_addr[] = { (CAM_ID>>1), I2C_CLIENT_END }; + static struct i2c_client_address_data addr_data = { + normal_i2c: normal_addr, +- normal_i2c_range: ignore, +- probe: ignore, +- probe_range: ignore, +- ignore: ignore, +- ignore_range: ignore, +- force: ignore, ++ probe: &ignore, ++ ignore: &ignore, + }; + + s5x532_t s5x532_regs_mirror[S5X532_REGS]; + + unsigned char +-s5x532_read(struct i2c_client *client,unsigned char subaddr) ++s5x532_read(struct i2c_client *client, unsigned char subaddr) + { + int ret; + unsigned char buf[1]; +@@ -151,7 +145,7 @@ void inline s5x532_init(struct i2c_client *sam_client) + } + + static int +-s5x532_attach(struct i2c_adapter *adap, int addr, unsigned short flags,int kind) ++s5x532_attach(struct i2c_adapter *adap, int addr, int kind) + { + struct i2c_client *c; + +@@ -159,13 +153,13 @@ s5x532_attach(struct i2c_adapter *adap, int addr, unsigned short flags,int kind) + if (!c) return -ENOMEM; + + strcpy(c->name, "S5X532"); +- c->id = s5x532_driver.id; +- c->flags = I2C_CLIENT_ALLOW_USE; ++// c->id = s5x532_driver.id; ++ c->flags = 0 /* I2C_CLIENT_ALLOW_USE */; + c->addr = addr; + c->adapter = adap; + c->driver = &s5x532_driver; +- c->data = &data; +- data.sensor = c; ++ data.sensor = c; ++ i2c_set_clientdata(c, &data); + + camif_register_decoder(c); + return i2c_attach_client(c); +@@ -192,10 +186,10 @@ s5x532_command(struct i2c_client *client, unsigned int cmd, void *arg) + printk(KERN_INFO "CAMERA: S5X532 Sensor initialized\n"); + break; + case USER_ADD: +- MOD_INC_USE_COUNT; ++ /* MOD_INC_USE_COUNT; uh.. 2.6 deals with this, old-timer */ + break; + case USER_EXIT: +- MOD_DEC_USE_COUNT; ++ /* MOD_DEC_USE_COUNT; */ + break; + /* Todo + case SENSOR_BRIGHTNESS: +@@ -210,9 +204,8 @@ s5x532_command(struct i2c_client *client, unsigned int cmd, void *arg) + } + + static struct i2c_driver s5x532_driver = { +- name: "S5X532", +- id: I2C_ALGO_S3C, +- flags: I2C_DF_NOTIFY, ++ driver: { name: "S5X532" }, ++ id: 0, /* optional in i2c-id.h I2C_ALGO_S3C, */ + attach_adapter: s5x532_probe, + detach_client: s5x532_detach, + command: s5x532_command +@@ -220,11 +213,13 @@ static struct i2c_driver s5x532_driver = { + + static void iic_gpio_port(void) + { ++/* FIXME: no gpio config for i2c !!! + #ifdef CONFIG_ARCH_S3C24A0A + #else + GPECON &= ~(0xf <<28); + GPECON |= 0xa <<28; + #endif ++*/ + } + + static __init int camif_sensor_init(void) +diff --git a/arch/arm/mach-s3c2440/camera/qt-driver.c b/arch/arm/mach-s3c2440/camera/qt-driver.c +index 0c5dd40..cbf8565 100644 +--- a/arch/arm/mach-s3c2440/camera/qt-driver.c ++++ b/arch/arm/mach-s3c2440/camera/qt-driver.c +@@ -31,12 +31,15 @@ + + //#define SW_DEBUG + ++#define CONFIG_VIDEO_V4L1_COMPAT ++#include <linux/videodev.h> + #include "camif.h" +-#include "videodev.h" + #include "miscdevice.h" + #include "cam_reg.h" + #include "sensor.h" + #include "userapp.h" ++ ++extern camif_cfg_t * get_camif(int nr); + + + /************************* Sharp Zarus API ************************** +diff --git a/arch/arm/mach-s3c2440/camera/video-driver.c b/arch/arm/mach-s3c2440/camera/video-driver.c +index fe9130c..9c77475 100644 +--- a/arch/arm/mach-s3c2440/camera/video-driver.c ++++ b/arch/arm/mach-s3c2440/camera/video-driver.c +@@ -29,11 +29,12 @@ + #include <asm/irq.h> + #include <asm/semaphore.h> + #include <linux/miscdevice.h> ++#include <asm/arch/irqs.h> + + //#define SW_DEBUG +- ++#define CONFIG_VIDEO_V4L1_COMPAT ++#include <linux/videodev.h> + #include "camif.h" +-#include "videodev.h" + #include "miscdevice.h" + #include "cam_reg.h" + #include "sensor.h" +@@ -46,12 +47,14 @@ + /* Codec and Preview */ + #define CAMIF_NUM 2 + static camif_cfg_t fimc[CAMIF_NUM]; ++u32 *camregs; + + static const char *driver_version = + "$Id: video-driver.c,v 1.9 2004/06/02 03:10:36 swlee Exp $"; + extern const char *fimc_version; + extern const char *fsm_version; + ++extern void camif_start_c_with_p (camif_cfg_t *cfg, camif_cfg_t *other); + + camif_cfg_t * get_camif(int nr) + { +@@ -177,28 +180,34 @@ camif_c_read(struct file *file, char *buf, size_t count, loff_t *pos) + } + + +-static void camif_c_irq(int irq, void *dev_id, struct pt_regs *regs) ++static irqreturn_t camif_c_irq(int irq, void *dev_id) + { + camif_cfg_t *cfg = (camif_cfg_t *)dev_id; ++ + DPRINTK("\n"); + camif_g_fifo_status(cfg); + camif_g_frame_num(cfg); +- if(camif_enter_c_4fsm(cfg) == INSTANT_SKIP) return; +- wake_up_interruptible(&cfg->waitq); ++ if(camif_enter_c_4fsm(cfg) != INSTANT_SKIP) ++ wake_up_interruptible(&cfg->waitq); ++ ++ return IRQ_HANDLED; + } + +-static void camif_p_irq(int irq, void *dev_id, struct pt_regs * regs) ++static irqreturn_t camif_p_irq(int irq, void *dev_id) + { + camif_cfg_t *cfg = (camif_cfg_t *)dev_id; ++ + DPRINTK("\n"); + camif_g_fifo_status(cfg); + camif_g_frame_num(cfg); +- if(camif_enter_p_4fsm(cfg) == INSTANT_SKIP) return; +- wake_up_interruptible(&cfg->waitq); ++ if(camif_enter_p_4fsm(cfg) != INSTANT_SKIP) ++ wake_up_interruptible(&cfg->waitq); + #if 0 + if( (cfg->perf.frames % 5) == 0) + DPRINTK("5\n"); + #endif ++ ++ return IRQ_HANDLED; + } + + static void camif_release_irq(camif_cfg_t *cfg) +@@ -213,13 +222,13 @@ static int camif_irq_request(camif_cfg_t *cfg) + + if (cfg->dma_type & CAMIF_CODEC) { + if ((ret = request_irq(cfg->irq, camif_c_irq, +- SA_INTERRUPT,cfg->shortname, cfg))) { ++ 0, cfg->shortname, cfg))) { + printk("request_irq(CAM_C) failed.\n"); + } + } + if (cfg->dma_type & CAMIF_PREVIEW) { + if ((ret = request_irq(cfg->irq, camif_p_irq, +- SA_INTERRUPT,cfg->shortname, cfg))) { ++ 0, cfg->shortname, cfg))) { + printk("request_irq(CAM_P) failed.\n"); + } + } +@@ -438,7 +447,7 @@ static struct video_device codec_template = + { + .name = "CODEC_IF", + .type = VID_TYPE_CAPTURE|VID_TYPE_CLIPPING|VID_TYPE_SCALES, +- .hardware = VID_HARDWARE_SAMSUNG_FIMC20, ++/* .hardware = VID_HARDWARE_SAMSUNG_FIMC20, */ + .fops = &camif_c_fops, + // .release = camif_release + .minor = -1, +@@ -448,7 +457,7 @@ static struct video_device preview_template = + { + .name = "PREVIEW_IF", + .type = VID_TYPE_CAPTURE|VID_TYPE_CLIPPING|VID_TYPE_SCALES, +- .hardware = VID_HARDWARE_SAMSUNG_FIMC20, ++/* .hardware = VID_HARDWARE_SAMSUNG_FIMC20, */ + .fops = &camif_p_fops, + .minor = -1, + }; +@@ -465,8 +474,8 @@ static int preview_init(camif_cfg_t *cfg) + cfg->fmt = CAMIF_RGB16; + cfg->flip = CAMIF_FLIP_Y; + cfg->v = &preview_template; +- init_MUTEX(&cfg->v->lock); +- cfg->irq = IRQ_CAM_P; ++ mutex_init(&cfg->v->lock); ++ cfg->irq = IRQ_S3C2440_CAM_P; + + strcpy(cfg->shortname,name); + init_waitqueue_head(&cfg->waitq); +@@ -486,8 +495,8 @@ static int codec_init(camif_cfg_t *cfg) + cfg->fmt = CAMIF_IN_YCBCR422|CAMIF_OUT_YCBCR420; + cfg->flip = CAMIF_FLIP_X; + cfg->v = &codec_template; +- init_MUTEX(&cfg->v->lock); +- cfg->irq = IRQ_CAM_C; ++ mutex_init(&cfg->v->lock); ++ cfg->irq = IRQ_S3C2440_CAM_C; + strcpy(cfg->shortname,name); + init_waitqueue_head(&cfg->waitq); + cfg->status = CAMIF_STOPPED; +@@ -510,25 +519,44 @@ static void print_version(void) + + static int camif_m_in(void) + { +- int ret = 0; ++ int ret = -EINVAL; + camif_cfg_t * cfg; + ++ printk(KERN_INFO"Starting S3C2440 Camera Driver\n"); ++ ++ camregs = ioremap(CAM_BASE_ADD, 0x100); ++ if (!camregs) { ++ printk(KERN_ERR"Unable to map camera regs\n"); ++ ret = -ENOMEM; ++ goto bail1; ++ } ++ + camif_init(); + cfg = get_camif(CODEC_MINOR); + codec_init(cfg); + +- if (video_register_device(cfg->v,0,CODEC_MINOR)!=0) { +- DPRINTK("Couldn't register codec driver.\n"); +- return 0; ++ ret = video_register_device(cfg->v,0,CODEC_MINOR); ++ if (ret) { ++ printk(KERN_ERR"Couldn't register codec driver.\n"); ++ goto bail2; + } + cfg = get_camif(PREVIEW_MINOR); + preview_init(cfg); +- if (video_register_device(cfg->v,0,PREVIEW_MINOR)!=0) { +- DPRINTK("Couldn't register preview driver.\n"); +- return 0; ++ ret = video_register_device(cfg->v,0,PREVIEW_MINOR); ++ if (ret) { ++ printk(KERN_ERR"Couldn't register preview driver.\n"); ++ goto bail3; /* hm seems it us unregistered the once */ + } + + print_version(); ++ return 0; ++ ++bail3: ++ video_unregister_device(cfg->v); ++bail2: ++ iounmap(camregs); ++ camregs = NULL; ++bail1: + return ret; + } + +@@ -536,7 +564,9 @@ static void unconfig_device(camif_cfg_t *cfg) + { + video_unregister_device(cfg->v); + camif_hw_close(cfg); ++ iounmap(camregs); + //memset(cfg, 0, sizeof(camif_cfg_t)); ++ camregs = NULL; + } + + static void camif_m_out(void) /* module out */ +@@ -547,20 +577,22 @@ static void camif_m_out(void) /* module out */ + unconfig_device(cfg); + cfg = get_camif(PREVIEW_MINOR); + unconfig_device(cfg); ++ + return; + } + + void camif_register_decoder(struct i2c_client *ptr) + { + camif_cfg_t *cfg; ++ void * data = i2c_get_clientdata(ptr); + + cfg =get_camif(CODEC_MINOR); +- cfg->gc = (camif_gc_t *)(ptr->data); ++ cfg->gc = (camif_gc_t *)(data); + + cfg =get_camif(PREVIEW_MINOR); +- cfg->gc = (camif_gc_t *)(ptr->data); ++ cfg->gc = (camif_gc_t *)(data); + +- sema_init(&cfg->gc->lock,1); /* global lock for both Codec and Preview */ ++ sema_init(&cfg->gc->lock, 1); /* global lock for both Codec and Preview */ + cfg->gc->status |= PNOTWORKING; /* Default Value */ + camif_hw_open(cfg->gc); + } +@@ -568,8 +600,9 @@ void camif_register_decoder(struct i2c_client *ptr) + void camif_unregister_decoder(struct i2c_client *ptr) + { + camif_gc_t *gc; ++ void * data = i2c_get_clientdata(ptr); + +- gc = (camif_gc_t *)(ptr->data); ++ gc = (camif_gc_t *)(data); + gc->init_sensor = 0; /* need to modify */ + } + +diff --git a/arch/arm/mach-s3c2440/camera/videodev.c b/arch/arm/mach-s3c2440/camera/videodev.c +index 0b3498f..6f862e4 100644 +--- a/arch/arm/mach-s3c2440/camera/videodev.c ++++ b/arch/arm/mach-s3c2440/camera/videodev.c +@@ -22,7 +22,7 @@ + #include <linux/init.h> + #include <linux/kmod.h> + #include <linux/slab.h> +-#include <linux/devfs_fs_kernel.h> ++/* #include <linux/devfs_fs_kernel.h> */ + #include <linux/miscdevice.h> + #include <asm/uaccess.h> + #include <asm/system.h> +@@ -30,8 +30,9 @@ + + + ++#define CONFIG_VIDEO_V4L1_COMPAT ++#include <linux/videodev.h> + #include "camif.h" +-#include "videodev.h" + #include "miscdevice.h" + + +@@ -42,18 +43,7 @@ const char *fimc_version = "$Id: videodev.c,v 1.1.1.1 2004/04/27 03:52:50 swlee + #define VIDEO_NAME "video4linux" + + +-static inline unsigned iminor(struct inode *inode) +-{ +- return MINOR(inode->i_rdev); +-} +- +-static inline unsigned imajor(struct inode *inode) +-{ +- return MAJOR(inode->i_rdev); +-} +- +- +-#define VIDEO_NUM_DEVICES 2 ++#define VIDEO_NUM_DEVICES 2 + static struct video_device *video_device[VIDEO_NUM_DEVICES]; + + static inline struct video_device * get_vd(int nr) +@@ -104,7 +94,7 @@ static int video_open(struct inode *inode, struct file *file) + int minor = MINOR(inode->i_rdev); + int err = 0; + struct video_device *vfl; +- struct file_operations *old_fops; ++ struct file_operations const *old_fops; + + down(&videodev_lock); + +@@ -131,13 +121,13 @@ extern int video_exclusive_open(struct inode *inode, struct file *file) + struct video_device *vfl = get_vd(MINOR(inode->i_rdev)); + int retval = 0; + +- down(&vfl->lock); ++ mutex_lock(&vfl->lock); + if (vfl->users) { + retval = -EBUSY; + } else { + vfl->users++; + } +- up(&vfl->lock); ++ mutex_unlock(&vfl->lock); + return retval; + } + +diff --git a/arch/arm/mach-s3c2440/camera/videodev.h b/arch/arm/mach-s3c2440/camera/videodev.h +index f12db43..1c2e35a 100644 +--- a/arch/arm/mach-s3c2440/camera/videodev.h ++++ b/arch/arm/mach-s3c2440/camera/videodev.h +@@ -1,11 +1,11 @@ +-#ifndef __LINUX_S3C_VIDEODEV_H +-#define __LINUX_S3C_VIDEODEV_H ++//#ifndef __LINUX_S3C_VIDEODEV_H ++//#define __LINUX_S3C_VIDEODEV_H + + #include <linux/types.h> + #include <linux/version.h> +-#include "videodev2.h" +- ++#include <media/v4l2-dev.h> + ++#if 0 + struct video_device + { + /* device info */ +@@ -96,12 +96,10 @@ extern int video_usercopy(struct inode *inode, struct file *file, + + + +-#define VID_HARDWARE_SAMSUNG_FIMC 255 +- +- +- +-#endif ++#endif ++//#endif + ++#define VID_HARDWARE_SAMSUNG_FIMC 255 + + /* + * Local variables: +-- +1.5.6.3 + |