add support for target 3c24xx (more known as Openmoko GTA02 "Freerunner") and merge...
[openwrt.git] / target / linux / s3c24xx / patches / 0146-uplevel-samsung-camera-unit.patch.patch
1 From 0bd2a8e00d4a1814d0a9d8206d52717e3f538b68 Mon Sep 17 00:00:00 2001
2 From: Andy Green <andy@opennoko.com>
3 Date: Fri, 25 Jul 2008 23:06:10 +0100
4 Subject: [PATCH] uplevel-samsung-camera-unit.patch
5
6 Update this old code to clk API, I2C changes, official GPIO API
7 various struct changes, explicit readl() writel(), DMA API changes.
8 Still not ready for actual use (eg, I2C) but a LOT closer.
9
10 Compiles on 2.6.24 without errors or warnings now.
11
12 Use CONFIG_S3C2440_CAMERA=y in .config
13
14 Signed-off-by: Andy Green <andy@openmoko.com>
15 ---
16  arch/arm/mach-s3c2440/Kconfig               |    5 +-
17  arch/arm/mach-s3c2440/Makefile              |    9 +-
18  arch/arm/mach-s3c2440/camera/Makefile       |    1 -
19  arch/arm/mach-s3c2440/camera/cam_reg.h      |   92 +++--
20  arch/arm/mach-s3c2440/camera/camif.c        |  633 +++++++++++++++------------
21  arch/arm/mach-s3c2440/camera/camif_fsm.c    |    5 +
22  arch/arm/mach-s3c2440/camera/imgsensor.c    |   43 +-
23  arch/arm/mach-s3c2440/camera/qt-driver.c    |    5 +-
24  arch/arm/mach-s3c2440/camera/video-driver.c |   87 +++--
25  arch/arm/mach-s3c2440/camera/videodev.c     |   24 +-
26  arch/arm/mach-s3c2440/camera/videodev.h     |   16 +-
27  11 files changed, 516 insertions(+), 404 deletions(-)
28
29 diff --git a/arch/arm/mach-s3c2440/Kconfig b/arch/arm/mach-s3c2440/Kconfig
30 index e042965..20dd2c5 100644
31 --- a/arch/arm/mach-s3c2440/Kconfig
32 +++ b/arch/arm/mach-s3c2440/Kconfig
33 @@ -30,9 +30,6 @@ config S3C2440_C_FIQ
34           Support for S3C2440 FIQ support in C -- see
35           ./arch/arm/macs3c2440/fiq_c_isr.c
36  
37 -source "arch/arm/mach-s3c2440/camera/Kconfig"
38 -
39 -
40  menu "S3C2440 Machines"
41  
42  config MACH_ANUBIS
43 @@ -96,3 +93,5 @@ config NEO1973_GTA02_2440
44            of the FIC/Openmoko Neo1973 GTA02 GSM Phone.
45  
46  endmenu
47 +
48 +#source "arch/arm/mach-s3c2440/camera/Kconfig"
49 diff --git a/arch/arm/mach-s3c2440/Makefile b/arch/arm/mach-s3c2440/Makefile
50 index e9c6334..964e50b 100644
51 --- a/arch/arm/mach-s3c2440/Makefile
52 +++ b/arch/arm/mach-s3c2440/Makefile
53 @@ -1,4 +1,10 @@
54 -obj-y                           += camera/
55 +# arch/arm/mach-s3c2440/Makefile
56 +#
57 +# Copyright 2007 Simtec Electronics
58 +#
59 +# Licensed under GPLv2
60 +
61 +obj-y                          :=
62  obj-m                          :=
63  obj-n                          :=
64  obj-                           :=
65 @@ -17,5 +23,6 @@ obj-$(CONFIG_MACH_RX3715)     += mach-rx3715.o
66  obj-$(CONFIG_ARCH_S3C2440)     += mach-smdk2440.o
67  obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o
68  obj-$(CONFIG_MACH_AT2440EVB) += mach-at2440evb.o
69 +obj-$(CONFIG_MACH_HXD8)                += mach-hxd8.o
70  obj-$(CONFIG_MACH_NEO1973_GTA02) += mach-gta02.o
71  
72 diff --git a/arch/arm/mach-s3c2440/camera/Makefile b/arch/arm/mach-s3c2440/camera/Makefile
73 index a46d3be..9cd6d79 100644
74 --- a/arch/arm/mach-s3c2440/camera/Makefile
75 +++ b/arch/arm/mach-s3c2440/camera/Makefile
76 @@ -1,7 +1,6 @@
77  obj-$(CONFIG_S3C2440_CAMERA) += \
78         videodev.o \
79         imgsensor.o \
80 -       videodrv.o \
81         video-driver.o \
82         camif.o \
83         camif_fsm.o \
84 diff --git a/arch/arm/mach-s3c2440/camera/cam_reg.h b/arch/arm/mach-s3c2440/camera/cam_reg.h
85 index 7247a4e..93d59b8 100644
86 --- a/arch/arm/mach-s3c2440/camera/cam_reg.h
87 +++ b/arch/arm/mach-s3c2440/camera/cam_reg.h
88 @@ -7,6 +7,7 @@
89  #ifndef __FIMC20_CAMERA_H__
90  #define __FIMC20_CAMERA_H__
91  
92 +extern u32 * camregs;
93  
94  #ifdef CONFIG_ARCH_S3C24A0
95  #define CAM_BASE_ADD             0x48000000
96 @@ -14,10 +15,23 @@
97  #define CAM_BASE_ADD             0x4F000000
98  #endif
99  
100 +#if ! defined(FExtr)
101 +#define UData(Data)     ((unsigned long) (Data))
102 +#define FExtr(Data, Field) \
103 +                        ((UData (Data) >> FShft (Field)) & FAlnMsk (Field))
104 +#define FInsrt(Value, Field) \
105 +                        (UData (Value) << FShft (Field))
106 +#define FSize(Field)    ((Field) >> 16)
107 +#define FShft(Field)    ((Field) & 0x0000FFFF)
108 +#define FMsk(Field)     (((UData (1) << FSize (Field)) - 1) << FShft (Field))
109 +#define FAlnMsk(Field)  ((UData (1) << FSize (Field)) - 1)
110 +#define F1stBit(Field)  (UData (1) << FShft (Field))
111 +#define Fld(Size, Shft) (((Size) << 16) + (Shft))
112 +#endif
113  
114  /*
115   * CAMERA IP
116 - * P-port is used as RGB Capturing device which including scale and crop 
117 + * P-port is used as RGB Capturing device which including scale and crop
118   *  those who want to see(preview ) the image on display needs RGB image.
119   *
120   * C-port is used as YCbCr(4:2:0, 4:2:2) Capturing device which including the scale and crop
121 @@ -25,45 +39,45 @@
122       YCBCB format not RGB 
123   */ 
124  
125 -#define CISRCFMT            __REG(CAM_BASE_ADD+0x00) // RW Input Source Format
126 -#define CIWDOFST            __REG(CAM_BASE_ADD+0x04) // Window offset register
127 -#define CIGCTRL             __REG(CAM_BASE_ADD+0x08) // Global control register
128 -#define CICOYSA0            __REG(CAM_BASE_ADD+0x18) // Y 1 st frame start address 
129 -#define CICOYSA1            __REG(CAM_BASE_ADD+0x1C) // Y 2 nd frame start address 
130 -#define CICOYSA2            __REG(CAM_BASE_ADD+0x20) // Y 3 rd frame start address 
131 -#define CICOYSA3            __REG(CAM_BASE_ADD+0x24) // Y 4 th frame start address 
132 -#define CICOCBSA0           __REG(CAM_BASE_ADD+0x28) // Cb 1 st frame start address 
133 -#define CICOCBSA1           __REG(CAM_BASE_ADD+0x2C) // Cb 2 nd frame start address 
134 -#define CICOCBSA2           __REG(CAM_BASE_ADD+0x30) // Cb 3 rd frame start address 
135 -#define CICOCBSA3           __REG(CAM_BASE_ADD+0x34) // Cb 4 th frame start address 
136 -#define CICOCRSA0           __REG(CAM_BASE_ADD+0x38) // Cr 1 st frame start address 
137 -#define CICOCRSA1           __REG(CAM_BASE_ADD+0x3C) // Cr 2 nd frame start address 
138 -#define CICOCRSA2           __REG(CAM_BASE_ADD+0x40) // Cr 3 rd frame start address 
139 -#define CICOCRSA3           __REG(CAM_BASE_ADD+0x44) // Cr 4 th frame start address 
140 -#define CICOTRGFMT          __REG(CAM_BASE_ADD+0x48) // Target image format of codec
141 -#define CICOCTRL            __REG(CAM_BASE_ADD+0x4C) // Codec DMA control related
142 -#define CICOSCPRERATIO      __REG(CAM_BASE_ADD+0x50) // Codec pre-scaler ratio control
143 -#define CICOSCPREDST        __REG(CAM_BASE_ADD+0x54) // Codec pre-scaler destination
144 -#define CICOSCCTRL          __REG(CAM_BASE_ADD+0x58) // Codec main-scaler control
145 -#define CICOTAREA           __REG(CAM_BASE_ADD+0x5C) // Codec pre-scaler destination
146 -#define CICOSTATUS          __REG(CAM_BASE_ADD+0x64) // Codec path status
147 -#define CIPRCLRSA0          __REG(CAM_BASE_ADD+0x6C) // RGB 1 st frame start address 
148 -#define CIPRCLRSA1          __REG(CAM_BASE_ADD+0x70) // RGB 2 nd frame start address 
149 -#define CIPRCLRSA2          __REG(CAM_BASE_ADD+0x74) // RGB 3 rd frame start address 
150 -#define CIPRCLRSA3          __REG(CAM_BASE_ADD+0x78) // RGB 4 th frame start address 
151 -#define CIPRTRGFMT          __REG(CAM_BASE_ADD+0x7C) // Target image format of preview
152 -#define CIPRCTRL            __REG(CAM_BASE_ADD+0x80) // Preview DMA control related
153 -#define CIPRSCPRERATIO      __REG(CAM_BASE_ADD+0x84) // Preview pre-scaler ratio control
154 -#define CIPRSCPREDST        __REG(CAM_BASE_ADD+0x88) // Preview pre-scaler destination
155 -#define CIPRSCCTRL          __REG(CAM_BASE_ADD+0x8C) // Preview main-scaler control
156 -#define CIPRTAREA           __REG(CAM_BASE_ADD+0x90) // Preview pre-scaler destination
157 -#define CIPRSTATUS          __REG(CAM_BASE_ADD+0x98) // Preview path status
158 -#define CIIMGCPT            __REG(CAM_BASE_ADD+0xA0) // Image capture enable command
159 -
160 -#define CICOYSA(__x)        __REG(CAM_BASE_ADD+0x18 + (__x)*4 ) 
161 -#define CICOCBSA(__x)       __REG(CAM_BASE_ADD+0x28 + (__x)*4 )
162 -#define CICOCRSA(__x)       __REG(CAM_BASE_ADD+0x38 + (__x)*4 ) 
163 -#define CIPRCLRSA(__x)      __REG(CAM_BASE_ADD+0x6C + (__x)*4 )
164 +#define S3C2440_CAM_REG_CISRCFMT            (0x00) // RW Input Source Format
165 +#define S3C2440_CAM_REG_CIWDOFST            (0x04) // Window offset register
166 +#define S3C2440_CAM_REG_CIGCTRL             (0x08) // Global control register
167 +#define S3C2440_CAM_REG_CICOYSA0            (0x18) // Y 1 st frame start ads
168 +#define S3C2440_CAM_REG_CICOYSA1            (0x1C) // Y 2 nd frame start ads
169 +#define S3C2440_CAM_REG_CICOYSA2            (0x20) // Y 3 rd frame start ads
170 +#define S3C2440_CAM_REG_CICOYSA3            (0x24) // Y 4 th frame start ads
171 +#define S3C2440_CAM_REG_CICOCBSA0           (0x28) // Cb 1 st frame start ads
172 +#define S3C2440_CAM_REG_CICOCBSA1           (0x2C) // Cb 2 nd frame start ads
173 +#define S3C2440_CAM_REG_CICOCBSA2           (0x30) // Cb 3 rd frame start ads
174 +#define S3C2440_CAM_REG_CICOCBSA3           (0x34) // Cb 4 th frame start ads
175 +#define S3C2440_CAM_REG_CICOCRSA0           (0x38) // Cr 1 st frame start ads
176 +#define S3C2440_CAM_REG_CICOCRSA1           (0x3C) // Cr 2 nd frame start ads
177 +#define S3C2440_CAM_REG_CICOCRSA2           (0x40) // Cr 3 rd frame start ads
178 +#define S3C2440_CAM_REG_CICOCRSA3           (0x44) // Cr 4 th frame start ads
179 +#define S3C2440_CAM_REG_CICOTRGFMT          (0x48) // Target img format of codec
180 +#define S3C2440_CAM_REG_CICOCTRL            (0x4C) // Codec DMA control related
181 +#define S3C2440_CAM_REG_CICOSCPRERATIO      (0x50) // Codec pre-scaler ratio
182 +#define S3C2440_CAM_REG_CICOSCPREDST        (0x54) // Codec pre-scaler dest
183 +#define S3C2440_CAM_REG_CICOSCCTRL          (0x58) // Codec main-scaler control
184 +#define S3C2440_CAM_REG_CICOTAREA           (0x5C) // Codec pre-scaler dest
185 +#define S3C2440_CAM_REG_CICOSTATUS          (0x64) // Codec path status
186 +#define S3C2440_CAM_REG_CIPRCLRSA0          (0x6C) // RGB 1 st frame start ads
187 +#define S3C2440_CAM_REG_CIPRCLRSA1          (0x70) // RGB 2 nd frame start ads
188 +#define S3C2440_CAM_REG_CIPRCLRSA2          (0x74) // RGB 3 rd frame start ads
189 +#define S3C2440_CAM_REG_CIPRCLRSA3          (0x78) // RGB 4 th frame start ads
190 +#define S3C2440_CAM_REG_CIPRTRGFMT          (0x7C) // Target img fmt of preview
191 +#define S3C2440_CAM_REG_CIPRCTRL            (0x80) // Preview DMA ctl related
192 +#define S3C2440_CAM_REG_CIPRSCPRERATIO      (0x84) // Preview pre-scaler ratio
193 +#define S3C2440_CAM_REG_CIPRSCPREDST        (0x88) // Preview pre-scaler dest
194 +#define S3C2440_CAM_REG_CIPRSCCTRL          (0x8C) // Preview main-scaler ctl
195 +#define S3C2440_CAM_REG_CIPRTAREA           (0x90) // Preview pre-scaler dest
196 +#define S3C2440_CAM_REG_CIPRSTATUS          (0x98) // Preview path status
197 +#define S3C2440_CAM_REG_CIIMGCPT            (0xA0) // Image capture enable cmd
198 +
199 +#define S3C2440_CAM_REG_CICOYSA(__x)        (0x18 + (__x)*4 )
200 +#define S3C2440_CAM_REG_CICOCBSA(__x)       (0x28 + (__x)*4 )
201 +#define S3C2440_CAM_REG_CICOCRSA(__x)       (0x38 + (__x)*4 )
202 +#define S3C2440_CAM_REG_CIPRCLRSA(__x)      (0x6C + (__x)*4 )
203  
204  /* CISRCFMT BitField */
205  #define SRCFMT_ITU601       BIT31
206 diff --git a/arch/arm/mach-s3c2440/camera/camif.c b/arch/arm/mach-s3c2440/camera/camif.c
207 index 36d4ccc..2e97e21 100644
208 --- a/arch/arm/mach-s3c2440/camera/camif.c
209 +++ b/arch/arm/mach-s3c2440/camera/camif.c
210 @@ -7,14 +7,11 @@
211   * for more details.
212   */
213  
214 -#include <linux/config.h>
215  #include <linux/module.h>
216  #include <linux/kernel.h>
217  #include <linux/init.h>
218  #include <linux/sched.h>
219  #include <linux/irq.h>
220 -#include <linux/tqueue.h>
221 -#include <linux/locks.h>
222  #include <linux/completion.h>
223  #include <linux/delay.h>
224  #include <linux/slab.h>
225 @@ -26,28 +23,29 @@
226  #include <asm/semaphore.h>
227  #include <asm/hardware.h>
228  #include <asm/uaccess.h>
229 +#include <linux/device.h>
230 +#include <linux/dma-mapping.h>
231 +#include <linux/clk.h>
232  
233  #ifdef CONFIG_ARCH_S3C24A0A
234  #include <asm/arch/S3C24A0.h>
235  #include <asm/arch/clocks.h>
236  #else
237 -#include <asm/arch/S3C2440.h>
238 -#include <asm/arch/clocks.h>
239 +#include <asm/arch/regs-gpio.h>
240 +#include <asm/arch/regs-gpioj.h>
241 +#include <asm/arch/regs-irq.h>
242  #endif
243  
244  #include "cam_reg.h"
245  //#define SW_DEBUG
246 +#define CONFIG_VIDEO_V4L1_COMPAT
247 +#include <linux/videodev.h>
248  #include "camif.h"
249 -#include "videodev.h"
250  #include "miscdevice.h"
251  
252 -
253  static int camif_dma_burst(camif_cfg_t *);
254  static int camif_scaler(camif_cfg_t *);
255  
256 -static const char *camif_version =
257 -        "$Id: camif.c,v 1.10 2004/06/04 04:24:14 swlee Exp $";
258 -       
259  /* For SXGA Image */
260  #define RESERVE_MEM  15*1024*1024
261  #define YUV_MEM      10*1024*1024
262 @@ -66,11 +64,13 @@ static int camif_malloc(camif_cfg_t *cfg)
263                 t_size = t_size *cfg->pp_num;
264  
265  #ifndef SAMSUNG_SXGA_CAM
266 -               cfg->pp_virt_buf = consistent_alloc(GFP_KERNEL, t_size, &cfg->pp_phys_buf);
267 +               cfg->pp_virt_buf = dma_alloc_coherent(cfg->v->dev,
268 +                                                     t_size, &cfg->pp_phys_buf,
269 +                                                     GFP_KERNEL);
270  #else
271                 printk(KERN_INFO "Reserving High RAM Addresses \n");
272                 cfg->pp_phys_buf = PHYS_OFFSET + (MEM_SIZE - RESERVE_MEM);
273 -               cfg->pp_virt_buf = ioremap_nocache(cfg->pp_phys_buf,YUV_MEM);
274 +               cfg->pp_virt_buf = ioremap_nocache(cfg->pp_phys_buf, YUV_MEM);
275  #endif
276  
277                 if ( !cfg->pp_virt_buf ) {
278 @@ -90,7 +90,9 @@ static int camif_malloc(camif_cfg_t *cfg)
279                 }
280                 t_size = t_size * cfg->pp_num;
281  #ifndef SAMSUNG_SXGA_CAM
282 -               cfg->pp_virt_buf = consistent_alloc(GFP_KERNEL, t_size, &cfg->pp_phys_buf);
283 +               cfg->pp_virt_buf = dma_alloc_coherent(cfg->v->dev,
284 +                                                     t_size, &cfg->pp_phys_buf,
285 +                                                     GFP_KERNEL);
286  #else
287                 printk(KERN_INFO "Reserving High RAM Addresses \n");
288                 cfg->pp_phys_buf = PHYS_OFFSET + (MEM_SIZE - RESERVE_MEM ) + YUV_MEM;
289 @@ -112,7 +114,8 @@ static int camif_demalloc(camif_cfg_t *cfg)
290  {
291  #ifndef SAMSUNG_SXGA_CAM
292         if ( cfg->pp_virt_buf ) {
293 -               consistent_free(cfg->pp_virt_buf,cfg->pp_totalsize,cfg->pp_phys_buf);
294 +               dma_free_coherent(cfg->v->dev, cfg->pp_totalsize,
295 +                                 cfg->pp_virt_buf, cfg->pp_phys_buf);
296                 cfg->pp_virt_buf = 0;
297         }
298  #else
299 @@ -131,13 +134,14 @@ int camif_g_frame_num(camif_cfg_t *cfg)
300         int index = 0;
301  
302         if (cfg->dma_type & CAMIF_CODEC ) {
303 -               index = FRAME_CNT(CICOSTATUS);
304 +               index = FRAME_CNT(readl(camregs + S3C2440_CAM_REG_CICOSTATUS));
305                 DPRINTK("CAMIF_CODEC frame %d \n", index);
306         }
307         else {
308                 assert(cfg->dma_type & CAMIF_PREVIEW );
309 -               index = FRAME_CNT(CIPRSTATUS);
310 -               DPRINTK("CAMIF_PREVIEW frame %d  0x%08X \n", index, CIPRSTATUS);
311 +               index = FRAME_CNT(readl(camregs + S3C2440_CAM_REG_CIPRSTATUS));
312 +               DPRINTK("CAMIF_PREVIEW frame %d  0x%08X \n", index,
313 +                       readl(camregs + S3C2440_CAM_REG_CIPRSTATUS));
314         }
315         cfg->now_frame_num = (index + 2) % 4; /* When 4 PingPong */
316         return index; /* meaningless */
317 @@ -148,60 +152,59 @@ static int camif_pp_codec(camif_cfg_t *cfg)
318         u32 i, c_size; /* Cb,Cr size */
319         u32 one_p_size;
320         u32 daon = cfg->target_x * cfg->target_y;
321 -       if (cfg->fmt & CAMIF_OUT_YCBCR420) {
322 -               c_size = daon /4;
323 -       }
324 +       if (cfg->fmt & CAMIF_OUT_YCBCR420)
325 +               c_size = daon / 4;
326         else {
327                 assert(cfg->fmt & CAMIF_OUT_YCBCR422);
328 -               c_size = daon /2;
329 +               c_size = daon / 2;
330         }
331         switch ( cfg->pp_num ) {
332 -               case 1 :
333 -                       for ( i =0 ; i < 4; i=i+1) {
334 -                               cfg->img_buf[i].virt_y = cfg->pp_virt_buf;
335 -                               cfg->img_buf[i].phys_y = cfg->pp_phys_buf;
336 -                               cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon; 
337 -                               cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon;
338 -                               cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size;
339 -                               cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size;
340 -                               CICOYSA(i)  =  cfg->img_buf[i].phys_y;
341 -                               CICOCBSA(i) =  cfg->img_buf[i].phys_cb;
342 -                               CICOCRSA(i) =  cfg->img_buf[i].phys_cr;
343 -                       }
344 -                       break;
345 -               case 2:
346 +       case 1 :
347 +               for (i =0 ; i < 4; i++) {
348 +                       cfg->img_buf[i].virt_y = cfg->pp_virt_buf;
349 +                       cfg->img_buf[i].phys_y = cfg->pp_phys_buf;
350 +                       cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon;
351 +                       cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon;
352 +                       cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size;
353 +                       cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size;
354 +                       writel(cfg->img_buf[i].phys_y, camregs + S3C2440_CAM_REG_CICOYSA(i));
355 +                       writel(cfg->img_buf[i].phys_cb, camregs + S3C2440_CAM_REG_CICOCBSA(i));
356 +                       writel(cfg->img_buf[i].phys_cr, camregs + S3C2440_CAM_REG_CICOCRSA(i));
357 +               }
358 +               break;
359 +       case 2:
360  #define  TRY   (( i%2 ) ? 1 :0)
361 -                       one_p_size = daon + 2*c_size;
362 -                       for (i = 0; i < 4  ; i++) {
363 -                               cfg->img_buf[i].virt_y = cfg->pp_virt_buf + TRY * one_p_size;
364 -                               cfg->img_buf[i].phys_y = cfg->pp_phys_buf + TRY * one_p_size;
365 -                               cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon + TRY * one_p_size;
366 -                               cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon + TRY * one_p_size;
367 -                               cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size + TRY * one_p_size;
368 -                               cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size + TRY * one_p_size;
369 -                               CICOYSA(i)  = cfg->img_buf[i].phys_y;
370 -                               CICOCBSA(i) = cfg->img_buf[i].phys_cb;
371 -                               CICOCRSA(i) = cfg->img_buf[i].phys_cr;
372 -                       }
373 -                       break;
374 -               case 4: 
375 -                       one_p_size = daon + 2*c_size;
376 -                       for (i = 0; i < 4 ; i++) {
377 -                               cfg->img_buf[i].virt_y = cfg->pp_virt_buf + i * one_p_size;
378 -                               cfg->img_buf[i].phys_y = cfg->pp_phys_buf + i * one_p_size;
379 -                               cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon + i * one_p_size;
380 -                               cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon + i * one_p_size;
381 -                               cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size + i * one_p_size;
382 -                               cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size + i * one_p_size;
383 -                               CICOYSA(i)  =  cfg->img_buf[i].phys_y;
384 -                               CICOCBSA(i) =  cfg->img_buf[i].phys_cb;
385 -                               CICOCRSA(i) =  cfg->img_buf[i].phys_cr;
386 -                       }
387 -                       break;
388 -               default:
389 -                       printk("Invalid PingPong Number %d \n",cfg->pp_num);
390 -                       panic("halt\n");
391 -       }
392 +               one_p_size = daon + 2*c_size;
393 +               for (i = 0; i < 4  ; i++) {
394 +                       cfg->img_buf[i].virt_y = cfg->pp_virt_buf + TRY * one_p_size;
395 +                       cfg->img_buf[i].phys_y = cfg->pp_phys_buf + TRY * one_p_size;
396 +                       cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon + TRY * one_p_size;
397 +                       cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon + TRY * one_p_size;
398 +                       cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size + TRY * one_p_size;
399 +                       cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size + TRY * one_p_size;
400 +                       writel(cfg->img_buf[i].phys_y, camregs + S3C2440_CAM_REG_CICOYSA(i));
401 +                       writel(cfg->img_buf[i].phys_cb, camregs + S3C2440_CAM_REG_CICOCBSA(i));
402 +                       writel(cfg->img_buf[i].phys_cr, camregs + S3C2440_CAM_REG_CICOCRSA(i));
403 +               }
404 +               break;
405 +       case 4:
406 +               one_p_size = daon + 2*c_size;
407 +               for (i = 0; i < 4 ; i++) {
408 +                       cfg->img_buf[i].virt_y = cfg->pp_virt_buf + i * one_p_size;
409 +                       cfg->img_buf[i].phys_y = cfg->pp_phys_buf + i * one_p_size;
410 +                       cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon + i * one_p_size;
411 +                       cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon + i * one_p_size;
412 +                       cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size + i * one_p_size;
413 +                       cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size + i * one_p_size;
414 +                       writel(cfg->img_buf[i].phys_y, camregs + S3C2440_CAM_REG_CICOYSA(i));
415 +                       writel(cfg->img_buf[i].phys_cb, camregs + S3C2440_CAM_REG_CICOCBSA(i));
416 +                       writel(cfg->img_buf[i].phys_cr, camregs + S3C2440_CAM_REG_CICOCRSA(i));
417 +               }
418 +               break;
419 +       default:
420 +               printk("Invalid PingPong Number %d \n",cfg->pp_num);
421 +               panic("halt\n");
422 +}
423         return 0;
424  }
425  
426 @@ -222,21 +225,21 @@ static int camif_pp_preview(camif_cfg_t *cfg)
427                         for ( i = 0; i < 4 ; i++ ) {
428                                 cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf ;
429                                 cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf ;
430 -                               CIPRCLRSA(i) = cfg->img_buf[i].phys_rgb;
431 +                               writel(cfg->img_buf[i].phys_rgb, camregs + S3C2440_CAM_REG_CICOCRSA(i));
432                         }
433                         break;
434                 case 2:
435                         for ( i = 0; i < 4 ; i++) {
436                                 cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf + TRY * daon;
437                                 cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf + TRY * daon;
438 -                               CIPRCLRSA(i) = cfg->img_buf[i].phys_rgb;
439 +                               writel(cfg->img_buf[i].phys_rgb, camregs + S3C2440_CAM_REG_CICOCRSA(i));
440                         }
441                         break;
442                 case 4:
443                         for ( i = 0; i < 4 ; i++) {
444                                 cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf + i * daon;
445                                 cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf + i * daon;
446 -                               CIPRCLRSA(i) = cfg->img_buf[i].phys_rgb;
447 +                               writel(cfg->img_buf[i].phys_rgb, camregs + S3C2440_CAM_REG_CICOCRSA(i));
448                         }
449                         break;
450                 default:
451 @@ -308,7 +311,7 @@ static int camif_source_fmt(camif_gc_t *gc)
452         cmd  |= SOURCE_HSIZE(gc->source_x)| SOURCE_VSIZE(gc->source_y);
453         /* Order422 */
454         cmd |=  gc->order422;
455 -       CISRCFMT = cmd;
456 +       writel(cmd, camregs + S3C2440_CAM_REG_CISRCFMT);
457  
458         return 0 ;
459  }
460 @@ -331,33 +334,24 @@ static int camif_target_fmt(camif_cfg_t *cfg)
461                         assert(cfg->fmt & CAMIF_OUT_YCBCR422);
462                         cmd |= OUT_YCBCR422|IN_YCBCR422;
463                 }
464 -               CICOTRGFMT = cmd | cfg->flip;
465 -       } 
466 -       else {
467 +               writel(cmd | cfg->flip, camregs + S3C2440_CAM_REG_CICOTRGFMT);
468 +
469 +       } else {
470                 assert(cfg->dma_type & CAMIF_PREVIEW);
471 -               CIPRTRGFMT = 
472 -                       TARGET_HSIZE(cfg->target_x)|TARGET_VSIZE(cfg->target_y)|cfg->flip;
473 +               writel(TARGET_HSIZE(cfg->target_x)|TARGET_VSIZE(cfg->target_y)|cfg->flip,
474 +                       camregs + S3C2440_CAM_REG_CIPRTRGFMT); 
475         }
476         return 0;
477  }
478  
479  void camif_change_flip(camif_cfg_t *cfg)
480  {
481 -       u32 cmd = 0;
482 +       u32 cmd = readl(camregs + S3C2440_CAM_REG_CICOTRGFMT);
483  
484 -       if (cfg->dma_type & CAMIF_CODEC ) {
485 -               /* YCBCR setting */  
486 -               cmd  = CICOTRGFMT;
487 -               cmd &= ~(BIT14|BIT15); /* Clear FLIP Mode */
488 -               cmd |= cfg->flip; 
489 -               CICOTRGFMT = cmd;
490 -       } 
491 -       else {
492 -               cmd  = CIPRTRGFMT;
493 -               cmd &= ~(BIT14|BIT15);
494 -               cmd |= cfg->flip;
495 -               CICOTRGFMT = cmd; 
496 -       }
497 +       cmd &= ~(BIT14|BIT15);
498 +       cmd |= cfg->flip;
499 +
500 +       writel(cmd, camregs + S3C2440_CAM_REG_CICOTRGFMT);
501  }
502  
503  
504 @@ -373,70 +367,81 @@ int camif_capture_start(camif_cfg_t *cfg)
505         u32 n_cmd = 0;          /* Next Command */
506  
507         switch(cfg->exec) {
508 -               case CAMIF_BOTH_DMA_ON:
509 -                       camif_reset(CAMIF_RESET,0); /* Flush Camera Core Buffer */              
510 -                       CIPRSCCTRL |= SCALERSTART;
511 -                       CICOSCCTRL |= SCALERSTART;
512 -                       n_cmd = CAMIF_CAP_PREVIEW_ON|CAMIF_CAP_CODEC_ON;
513 -                       break;
514 -               case CAMIF_DMA_ON:
515 -                       camif_reset(CAMIF_RESET,0); /* Flush Camera Core Buffer */              
516 -                       if (cfg->dma_type&CAMIF_CODEC) {
517 -                               CICOSCCTRL |= SCALERSTART;
518 -                               n_cmd = CAMIF_CAP_CODEC_ON;
519 -                       }else {
520 -                               CIPRSCCTRL |= SCALERSTART;
521 -                               n_cmd = CAMIF_CAP_PREVIEW_ON;
522 -                       }
523 +       case CAMIF_BOTH_DMA_ON:
524 +               camif_reset(CAMIF_RESET, 0); /* Flush Camera Core Buffer */
525 +               writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) |
526 +                            SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL);
527 +               writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) |
528 +                            SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL);
529 +               n_cmd = CAMIF_CAP_PREVIEW_ON | CAMIF_CAP_CODEC_ON;
530 +               break;
531 +       case CAMIF_DMA_ON:
532 +               camif_reset(CAMIF_RESET, 0); /* Flush Camera Core Buffer */
533 +               if (cfg->dma_type&CAMIF_CODEC) {
534 +                       writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) |
535 +                            SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL);
536 +                       n_cmd = CAMIF_CAP_CODEC_ON;
537 +               } else {
538 +                       writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) |
539 +                            SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL);
540 +                       n_cmd = CAMIF_CAP_PREVIEW_ON;
541 +               }
542  
543 -                       /* wait until Sync Time expires */
544 -                       /* First settting, to wait VSYNC fall  */
545 -                       /* By VESA spec,in 640x480 @60Hz 
546 -                          MAX Delay Time is around 64us which "while" has.*/ 
547 -                       while(VSYNC & CICOSTATUS);
548 -                       break;
549 -               default:
550 -                       break;
551 -       }
552 -       CIIMGCPT = n_cmd|CAMIF_CAP_ON;
553 +               /* wait until Sync Time expires */
554 +               /* First settting, to wait VSYNC fall  */
555 +               /* By VESA spec,in 640x480 @60Hz
556 +                       MAX Delay Time is around 64us which "while" has.*/
557 +               while(VSYNC & readl(camregs + S3C2440_CAM_REG_CICOSTATUS));
558 +               break;
559 +       default:
560 +               break;
561 +}
562 +       writel(n_cmd | CAMIF_CAP_ON, camregs + S3C2440_CAM_REG_CIIMGCPT); 
563         return 0;
564  }
565  
566  
567  int camif_capture_stop(camif_cfg_t *cfg)
568  {
569 -       u32 n_cmd = CIIMGCPT;   /* Next Command */
570 +       u32 n_cmd = readl(camregs + S3C2440_CAM_REG_CIIMGCPT);  /* Next Command */
571  
572         switch(cfg->exec) {
573 -               case CAMIF_BOTH_DMA_OFF:
574 -                       CIPRSCCTRL &= ~SCALERSTART;
575 -                       CICOSCCTRL &= ~SCALERSTART;
576 -                       n_cmd = 0;
577 -                       break;
578 -               case CAMIF_DMA_OFF_L_IRQ: /* fall thru */
579 -               case CAMIF_DMA_OFF:
580 -                       if (cfg->dma_type&CAMIF_CODEC) {
581 -                               CICOSCCTRL &= ~SCALERSTART;
582 -                               n_cmd &= ~CAMIF_CAP_CODEC_ON;
583 -                               if (!(n_cmd & CAMIF_CAP_PREVIEW_ON))
584 -                                       n_cmd = 0;
585 -                       }else {
586 -                               CIPRSCCTRL &= ~SCALERSTART;
587 -                               n_cmd &= ~CAMIF_CAP_PREVIEW_ON;
588 -                               if (!(n_cmd & CAMIF_CAP_CODEC_ON))
589 -                                       n_cmd = 0;
590 -                       }
591 -                       break;
592 -               default:
593 -                       panic("Unexpected \n");
594 -       }
595 -       CIIMGCPT = n_cmd;
596 -       if(cfg->exec == CAMIF_DMA_OFF_L_IRQ) { /* Last IRQ  */
597 -               if (cfg->dma_type & CAMIF_CODEC) 
598 -                       CICOCTRL |= LAST_IRQ_EN;
599 -               else 
600 -                       CIPRCTRL |= LAST_IRQ_EN;
601 -       } 
602 +       case CAMIF_BOTH_DMA_OFF:
603 +               writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) &
604 +                       ~SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL);
605 +               writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) &
606 +                       ~SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL);
607 +               n_cmd = 0;
608 +               break;
609 +       case CAMIF_DMA_OFF_L_IRQ: /* fall thru */
610 +       case CAMIF_DMA_OFF:
611 +               if (cfg->dma_type&CAMIF_CODEC) {
612 +                       writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) &
613 +                           ~SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL);
614 +                       n_cmd &= ~CAMIF_CAP_CODEC_ON;
615 +                       if (!(n_cmd & CAMIF_CAP_PREVIEW_ON))
616 +                               n_cmd = 0;
617 +               } else {
618 +                       writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) &
619 +                           ~SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL);
620 +                       n_cmd &= ~CAMIF_CAP_PREVIEW_ON;
621 +                       if (!(n_cmd & CAMIF_CAP_CODEC_ON))
622 +                               n_cmd = 0;
623 +               }
624 +               break;
625 +       default:
626 +               panic("Unexpected \n");
627 +       }
628 +       writel(n_cmd, camregs + S3C2440_CAM_REG_CIIMGCPT);
629 +
630 +       if (cfg->exec == CAMIF_DMA_OFF_L_IRQ) { /* Last IRQ  */
631 +               if (cfg->dma_type & CAMIF_CODEC)
632 +                       writel(readl(camregs + S3C2440_CAM_REG_CICOCTRL) |
633 +                            LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CICOCTRL);
634 +               else
635 +                       writel(readl(camregs + S3C2440_CAM_REG_CIPRCTRL) |
636 +                            LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CIPRCTRL);
637 +       }
638  #if 0
639         else {                          /* to make internal state machine of CAMERA stop */
640                 camif_reset(CAMIF_RESET, 0);
641 @@ -449,16 +454,13 @@ int camif_capture_stop(camif_cfg_t *cfg)
642  /* LastIRQEn is autoclear */
643  void camif_last_irq_en(camif_cfg_t *cfg)
644  {
645 -       if(cfg->exec == CAMIF_BOTH_DMA_ON) {
646 -               CIPRCTRL |= LAST_IRQ_EN;
647 -               CICOCTRL |= LAST_IRQ_EN;
648 -       }
649 -       else {
650 -               if (cfg->dma_type & CAMIF_CODEC) 
651 -                       CICOCTRL |= LAST_IRQ_EN;
652 -               else 
653 -                       CIPRCTRL |= LAST_IRQ_EN;
654 -       }
655 +       if ((cfg->exec == CAMIF_BOTH_DMA_ON) || (cfg->dma_type & CAMIF_CODEC))
656 +               writel(readl(camregs + S3C2440_CAM_REG_CICOCTRL) |
657 +                       LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CICOCTRL);
658 +
659 +       if ((cfg->exec == CAMIF_BOTH_DMA_ON) || !(cfg->dma_type & CAMIF_CODEC))
660 +               writel(readl(camregs + S3C2440_CAM_REG_CIPRCTRL) |
661 +                       LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CIPRCTRL);
662  }
663  
664  static int  
665 @@ -502,23 +504,33 @@ int camif_g_fifo_status(camif_cfg_t *cfg)
666         u32 reg;
667  
668         if (cfg->dma_type & CAMIF_CODEC) {
669 -               u32 flag = CO_OVERFLOW_Y|CO_OVERFLOW_CB|CO_OVERFLOW_CR;
670 -               reg = CICOSTATUS;
671 +               u32 flag = CO_OVERFLOW_Y | CO_OVERFLOW_CB | CO_OVERFLOW_CR;
672 +               reg = readl(camregs + S3C2440_CAM_REG_CICOSTATUS);
673                 if (reg & flag) {
674                         printk("CODEC: FIFO error(0x%08x) and corrected\n",reg);
675                         /* FIFO Error Count ++  */
676 -                       CIWDOFST |= CO_FIFO_Y|CO_FIFO_CB|CO_FIFO_CR;
677 -                       CIWDOFST &= ~(CO_FIFO_Y|CO_FIFO_CB|CO_FIFO_CR);
678 +                       writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) |
679 +                               CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR,
680 +                               camregs + S3C2440_CAM_REG_CIWDOFST);
681 +
682 +                       writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) &
683 +                               ~(CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR),
684 +                               camregs + S3C2440_CAM_REG_CIWDOFST);
685                         return 1; /* Error */
686                 }
687         }
688         if (cfg->dma_type & CAMIF_PREVIEW) {
689 -               u32 flag = PR_OVERFLOW_CB|PR_OVERFLOW_CR;
690 -               reg = CIPRSTATUS;
691 +               u32 flag = PR_OVERFLOW_CB | PR_OVERFLOW_CR;
692 +               reg = readl(camregs + S3C2440_CAM_REG_CIPRSTATUS);
693                 if (reg & flag) {
694                         printk("PREVIEW:FIFO error(0x%08x) and corrected\n",reg);
695 -                       CIWDOFST |= PR_FIFO_CB|PR_FIFO_CR;
696 -                       CIWDOFST &= ~(CO_FIFO_Y|CO_FIFO_CB|CO_FIFO_CR);
697 +                       writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) |
698 +                               CO_FIFO_CB | CO_FIFO_CR,
699 +                               camregs + S3C2440_CAM_REG_CIWDOFST);
700 +
701 +                       writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) &
702 +                               ~(CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR),
703 +                               camregs + S3C2440_CAM_REG_CIWDOFST);
704                         /* FIFO Error Count ++  */
705                         return 1; /* Error */
706                 }
707 @@ -537,13 +549,16 @@ int camif_win_offset(camif_gc_t *gc )
708         u32 v = gc->win_ver_ofst;
709  
710         /*Clear Overflow */
711 -       CIWDOFST = CO_FIFO_Y|CO_FIFO_CB|CO_FIFO_CR|PR_FIFO_CB|PR_FIFO_CB;
712 -       CIWDOFST = 0;           /* ? Dummy */
713 +       writel(CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR | PR_FIFO_CB | PR_FIFO_CB,
714 +               camregs + S3C2440_CAM_REG_CIWDOFST);
715 +       writel(0, camregs + S3C2440_CAM_REG_CIWDOFST);
716 +
717         if (!h && !v)   {
718 -               CIWDOFST = 0;
719 +               writel(0, camregs + S3C2440_CAM_REG_CIWDOFST);
720                 return 0;
721         }
722 -       CIWDOFST = WINOFEN | WINHOROFST(h) | WINVEROFST(v);
723 +
724 +       writel(WINOFEN | WINHOROFST(h) | WINVEROFST(v), camregs + S3C2440_CAM_REG_CIWDOFST);
725         return 0;
726  }
727  
728 @@ -554,7 +569,7 @@ int camif_win_offset(camif_gc_t *gc )
729   */
730  static void camif_polarity(camif_gc_t *gc)
731  {
732 -       u32 cmd = CIGCTRL;
733 +       u32 cmd = readl(camregs + S3C2440_CAM_REG_CIGCTRL);;
734         
735         cmd = cmd & ~(BIT26|BIT25|BIT24); /* clear polarity */
736         if (gc->polarity_pclk)
737 @@ -563,7 +578,8 @@ static void camif_polarity(camif_gc_t *gc)
738                 cmd |= GC_INVPOLVSYNC;
739         if (gc->polarity_href)
740                 cmd |= GC_INVPOLHREF;
741 -       CIGCTRL |= cmd;
742 +       writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) |
743 +              cmd, camregs + S3C2440_CAM_REG_CIGCTRL);
744  }
745  
746  
747 @@ -599,12 +615,13 @@ int camif_dynamic_close(camif_cfg_t *cfg)
748  static int camif_target_area(camif_cfg_t *cfg) 
749  {
750         u32 rect = cfg->target_x * cfg->target_y;
751 -       if (cfg->dma_type & CAMIF_CODEC ) {
752 -               CICOTAREA = rect;
753 -       }
754 -       if (cfg->dma_type & CAMIF_PREVIEW) {
755 -               CIPRTAREA = rect;
756 -       }
757 +
758 +       if (cfg->dma_type & CAMIF_CODEC)
759 +               writel(rect, camregs + S3C2440_CAM_REG_CICOTAREA);
760 +
761 +       if (cfg->dma_type & CAMIF_PREVIEW)
762 +               writel(rect, camregs + S3C2440_CAM_REG_CIPRTAREA);
763 +
764         return 0;
765  }
766  
767 @@ -613,40 +630,44 @@ static int inline camif_hw_reg(camif_cfg_t *cfg)
768         u32 cmd = 0;
769  
770         if (cfg->dma_type & CAMIF_CODEC) {
771 -               CICOSCPRERATIO = PRE_SHIFT(cfg->sc.shfactor)
772 -                       |PRE_HRATIO(cfg->sc.prehratio)|PRE_VRATIO(cfg->sc.prevratio);
773 -               CICOSCPREDST = 
774 -                       PRE_DST_WIDTH(cfg->sc.predst_x)|PRE_DST_HEIGHT(cfg->sc.predst_y);
775 +               writel(PRE_SHIFT(cfg->sc.shfactor) |
776 +                      PRE_HRATIO(cfg->sc.prehratio) |
777 +                      PRE_VRATIO(cfg->sc.prevratio),
778 +                      camregs + S3C2440_CAM_REG_CICOSCPRERATIO);
779 +               writel(PRE_DST_WIDTH(cfg->sc.predst_x) |
780 +                      PRE_DST_HEIGHT(cfg->sc.predst_y),
781 +                      camregs + S3C2440_CAM_REG_CICOSCPREDST);
782  
783                 /* Differ from Preview */
784                 if (cfg->sc.scalerbypass)
785                         cmd |= SCALERBYPASS;
786                 if (cfg->sc.scaleup_h & cfg->sc.scaleup_v)
787                         cmd |= BIT30|BIT29;
788 -               CICOSCCTRL = cmd | MAIN_HRATIO(cfg->sc.mainhratio)
789 -                       |MAIN_VRATIO(cfg->sc.mainvratio);
790 +               writel(cmd | MAIN_HRATIO(cfg->sc.mainhratio) |
791 +                      MAIN_VRATIO(cfg->sc.mainvratio),
792 +                      camregs + S3C2440_CAM_REG_CICOSCCTRL);
793                 return 0;
794         }
795 -       else if (cfg->dma_type & CAMIF_PREVIEW) {
796 -               CIPRSCPRERATIO = PRE_SHIFT(cfg->sc.shfactor)
797 -                       |PRE_HRATIO(cfg->sc.prehratio)|PRE_VRATIO(cfg->sc.prevratio);
798 -               CIPRSCPREDST = 
799 -                       PRE_DST_WIDTH(cfg->sc.predst_x)|PRE_DST_HEIGHT(cfg->sc.predst_y);
800 +       if (cfg->dma_type & CAMIF_PREVIEW) {
801 +               writel(PRE_SHIFT(cfg->sc.shfactor) |
802 +                      PRE_HRATIO(cfg->sc.prehratio) |
803 +                      PRE_VRATIO(cfg->sc.prevratio),
804 +                      camregs + S3C2440_CAM_REG_CIPRSCPRERATIO);
805 +               writel(PRE_DST_WIDTH(cfg->sc.predst_x) |
806 +                      PRE_DST_HEIGHT(cfg->sc.predst_y),
807 +                      camregs + S3C2440_CAM_REG_CIPRSCPREDST);
808                 /* Differ from Codec */
809 -               if (cfg->fmt & CAMIF_RGB24) {
810 +               if (cfg->fmt & CAMIF_RGB24)
811                         cmd |= RGB_FMT24;  
812 -               }
813 -               else {
814 -                       /* RGB16 */;
815 -               }               
816                 if (cfg->sc.scaleup_h & cfg->sc.scaleup_v)
817 -                       cmd |= BIT29|BIT28;
818 -               CIPRSCCTRL = cmd |MAIN_HRATIO(cfg->sc.mainhratio)|S_METHOD
819 -                       |MAIN_VRATIO(cfg->sc.mainvratio);
820 -       }else {
821 -               panic("CAMERA:DMA_TYPE Wrong \n");
822 +                       cmd |= BIT29 | BIT28;
823 +               writel(cmd | MAIN_HRATIO(cfg->sc.mainhratio) | S_METHOD |
824 +                      MAIN_VRATIO(cfg->sc.mainvratio),
825 +                      camregs + S3C2440_CAM_REG_CIPRSCCTRL);
826 +               return 0;
827         }
828  
829 +       panic("CAMERA:DMA_TYPE Wrong \n");
830         return 0;
831  }
832  
833 @@ -654,46 +675,50 @@ static int inline camif_hw_reg(camif_cfg_t *cfg)
834  /* Configure Pre-scaler control  & main scaler control register */
835  static int camif_scaler(camif_cfg_t *cfg)
836  {
837 -       int tx = cfg->target_x,ty=cfg->target_y;
838 +       int tx = cfg->target_x, ty = cfg->target_y;
839         int sx, sy;
840  
841 -       if (tx <= 0 || ty<= 0)  panic("CAMERA: Invalid target size \n");
842 +       if (tx <= 0 || ty <= 0)
843 +               panic("CAMERA: Invalid target size \n");
844 +
845 +       sx = cfg->gc->source_x - 2 * cfg->gc->win_hor_ofst;
846 +       sy = cfg->gc->source_y - 2 * cfg->gc->win_ver_ofst;     
847 +       if (sx <= 0 || sy <= 0)
848 +               panic("CAMERA: Invalid source size \n");
849  
850 -       sx = cfg->gc->source_x - 2*cfg->gc->win_hor_ofst;
851 -       sy = cfg->gc->source_y - 2*cfg->gc->win_ver_ofst;       
852 -       if (sx <= 0 || sy<= 0)  panic("CAMERA: Invalid source size \n");
853         cfg->sc.modified_src_x = sx;
854         cfg->sc.modified_src_y = sy;
855  
856         /* Pre-scaler control register 1 */
857 -       camif_scaler_internal(sx,tx,&cfg->sc.prehratio,&cfg->sc.hfactor);
858 -       camif_scaler_internal(sy,ty,&cfg->sc.prevratio,&cfg->sc.vfactor);
859 +       camif_scaler_internal(sx, tx, &cfg->sc.prehratio, &cfg->sc.hfactor);
860 +       camif_scaler_internal(sy, ty, &cfg->sc.prevratio, &cfg->sc.vfactor);
861  
862 -       if (cfg->dma_type & CAMIF_PREVIEW) {
863 -               if ( (sx /cfg->sc.prehratio) <= 640 ) {}
864 -               else {
865 -                       printk(KERN_INFO "CAMERA: Internal Preview line buffer is 640 pixels\n");
866 +       if (cfg->dma_type & CAMIF_PREVIEW)
867 +               if ((sx / cfg->sc.prehratio) > 640) {
868 +                       printk(KERN_INFO "CAMERA: Internal Preview line "
869 +                                        "buffer is 640 pixels\n");
870                         return 1; /* Error */
871                 }
872 -       }
873  
874 -       cfg->sc.shfactor = 10-(cfg->sc.hfactor+cfg->sc.vfactor);
875 +       cfg->sc.shfactor = 10 - (cfg->sc.hfactor + cfg->sc.vfactor);
876         /* Pre-scaler control register 2 */
877         cfg->sc.predst_x = sx / cfg->sc.prehratio;
878         cfg->sc.predst_y = sy / cfg->sc.prevratio;
879  
880         /* Main-scaler control register */
881 -       cfg->sc.mainhratio = (sx << 8)/(tx << cfg->sc.hfactor);
882 -       cfg->sc.mainvratio = (sy << 8)/(ty << cfg->sc.vfactor);
883 -       DPRINTK(" sx %d, sy %d tx %d ty %d  \n",sx,sy,tx,ty);
884 -       DPRINTK(" hfactor %d  vfactor %d \n",cfg->sc.hfactor,cfg->sc.vfactor);
885 +       cfg->sc.mainhratio = (sx << 8) / (tx << cfg->sc.hfactor);
886 +       cfg->sc.mainvratio = (sy << 8) / (ty << cfg->sc.vfactor);
887 +       DPRINTK(" sx %d, sy %d tx %d ty %d  \n", sx, sy, tx, ty);
888 +       DPRINTK(" hfactor %d  vfactor %d \n",cfg->sc.hfactor, cfg->sc.vfactor);
889  
890         cfg->sc.scaleup_h  = (sx <= tx) ? 1: 0;
891         cfg->sc.scaleup_v  = (sy <= ty) ? 1: 0;
892 -       if ( cfg->sc.scaleup_h != cfg->sc.scaleup_v) 
893 +       if (cfg->sc.scaleup_h != cfg->sc.scaleup_v)
894                 printk(KERN_ERR "scaleup_h must be same to scaleup_v \n");
895 +
896         camif_hw_reg(cfg);
897         camif_target_area(cfg);
898 +
899         return 0;
900  }
901  
902 @@ -706,38 +731,38 @@ static void camif_g_bsize(u32 hsize, u32 *mburst, u32 *rburst)
903  {
904         u32 tmp;
905  
906 -       tmp = (hsize/4) % 16;
907 +       tmp = (hsize / 4) % 16;
908         switch(tmp) {
909 +       case 0:
910 +               *mburst=16;
911 +               *rburst=16;
912 +               break;
913 +       case 4:
914 +               *mburst=16;
915 +               *rburst=4;
916 +               break;
917 +       case 8:
918 +               *mburst=16;
919 +               *rburst=8;
920 +               break;
921 +       default:
922 +               tmp=(hsize / 4) % 8;
923 +               switch(tmp) {
924                 case 0:
925 -                       *mburst=16;
926 -                       *rburst=16;
927 +                       *mburst = 8;
928 +                       *rburst = 8;
929                         break;
930                 case 4:
931 -                       *mburst=16;
932 -                       *rburst=4;
933 -                       break;
934 -               case 8:
935 -                       *mburst=16;
936 -                       *rburst=8;
937 -                       break;
938 +                       *mburst = 8;
939 +                       *rburst = 4;
940                 default:
941 -                       tmp=(hsize/4)%8;
942 -                       switch(tmp) {
943 -                               case 0:
944 -                                       *mburst=8;
945 -                                       *rburst=8;
946 -                                       break;
947 -                               case 4:
948 -                                       *mburst=8;
949 -                                       *rburst=4;
950 -                               default:
951 -                                       *mburst=4;
952 -                                       tmp=(hsize/4)%4;
953 -                                       *rburst= (tmp) ? tmp: 4;
954 -                                       break;
955 -                       }
956 +                       *mburst = 4;
957 +                       tmp = (hsize / 4) % 4;
958 +                       *rburst= (tmp) ? tmp: 4;
959                         break;
960         }
961 +               break;
962 +       }
963  }
964  
965  /* SXGA 1028x1024*/
966 @@ -759,24 +784,30 @@ static int camif_dma_burst(camif_cfg_t *cfg)
967                 u32 yburst_m, yburst_r;
968                 u32 cburst_m, cburst_r;
969                 /* CODEC DMA WIDHT is multiple of 16 */
970 -               if (width %16 != 0 )  return BURST_ERR;   /* DMA Burst Length Error */
971 -               camif_g_bsize(width,&yburst_m,&yburst_r);
972 -               camif_g_bsize(width/2,&cburst_m,&cburst_r);
973 -               CICOCTRL =YBURST_M(yburst_m)|CBURST_M(cburst_m)
974 -                       |YBURST_R(yburst_r)|CBURST_R(cburst_r);
975 +               if (width % 16)
976 +                       return BURST_ERR;   /* DMA Burst Length Error */
977 +               camif_g_bsize(width, &yburst_m, &yburst_r);
978 +               camif_g_bsize(width / 2, &cburst_m, &cburst_r);
979 +
980 +               writel(YBURST_M(yburst_m) | CBURST_M(cburst_m) |
981 +                      YBURST_R(yburst_r) | CBURST_R(cburst_r),
982 +                      camregs + S3C2440_CAM_REG_CICOCTRL);
983         }
984  
985         if (cfg->dma_type & CAMIF_PREVIEW) {
986                 u32 rgburst_m, rgburst_r;
987                 if(cfg->fmt == CAMIF_RGB24) {
988 -                       if (width %2 != 0 )  return BURST_ERR;   /* DMA Burst Length Error */
989 +                       if (width % 2)
990 +                               return BURST_ERR;   /* DMA Burst Length Error */
991                         camif_g_bsize(width*4,&rgburst_m,&rgburst_r);
992 -               }
993 -               else {          /* CAMIF_RGB16 */
994 -                       if ((width/2) %2 != 0 )  return BURST_ERR; /* DMA Burst Length Error */
995 +               } else {                /* CAMIF_RGB16 */
996 +                       if ((width / 2) %2)
997 +                               return BURST_ERR; /* DMA Burst Length Error */
998                         camif_g_bsize(width*2,&rgburst_m,&rgburst_r);  
999                 }
1000 -                       CIPRCTRL = RGBURST_M(rgburst_m) | RGBURST_R(rgburst_r);
1001 +
1002 +               writel(RGBURST_M(rgburst_m) | RGBURST_R(rgburst_r),
1003 +                      camregs + S3C2440_CAM_REG_CIPRCTRL);
1004         }
1005         return 0;
1006  }
1007 @@ -786,19 +817,20 @@ static int camif_gpio_init(void)
1008  #ifdef CONFIG_ARCH_S3C24A0A
1009         /* S3C24A0A has the dedicated signal pins for Camera */
1010  #else
1011 -       set_gpio_ctrl(GPIO_CAMDATA0);
1012 -       set_gpio_ctrl(GPIO_CAMDATA1);
1013 -       set_gpio_ctrl(GPIO_CAMDATA2);
1014 -       set_gpio_ctrl(GPIO_CAMDATA3);
1015 -       set_gpio_ctrl(GPIO_CAMDATA4);
1016 -       set_gpio_ctrl(GPIO_CAMDATA5);
1017 -       set_gpio_ctrl(GPIO_CAMDATA6);
1018 -       set_gpio_ctrl(GPIO_CAMDATA7);
1019 -       set_gpio_ctrl(GPIO_CAMPCLKIN);
1020 -       set_gpio_ctrl(GPIO_CAMVSYNC);
1021 -       set_gpio_ctrl(GPIO_CAMHREF);
1022 -       set_gpio_ctrl(GPIO_CAMPCLKOUT);
1023 -       set_gpio_ctrl(GPIO_CAMRESET);
1024 +       s3c2410_gpio_cfgpin(S3C2440_GPJ0, S3C2440_GPJ0_CAMDATA0);
1025 +       s3c2410_gpio_cfgpin(S3C2440_GPJ1, S3C2440_GPJ1_CAMDATA1);
1026 +       s3c2410_gpio_cfgpin(S3C2440_GPJ2, S3C2440_GPJ2_CAMDATA2);
1027 +       s3c2410_gpio_cfgpin(S3C2440_GPJ3, S3C2440_GPJ3_CAMDATA3);
1028 +       s3c2410_gpio_cfgpin(S3C2440_GPJ4, S3C2440_GPJ4_CAMDATA4);
1029 +       s3c2410_gpio_cfgpin(S3C2440_GPJ5, S3C2440_GPJ5_CAMDATA5);
1030 +       s3c2410_gpio_cfgpin(S3C2440_GPJ6, S3C2440_GPJ6_CAMDATA6);
1031 +       s3c2410_gpio_cfgpin(S3C2440_GPJ7, S3C2440_GPJ7_CAMDATA7);
1032 +
1033 +       s3c2410_gpio_cfgpin(S3C2440_GPJ8, S3C2440_GPJ8_CAMPCLK);
1034 +       s3c2410_gpio_cfgpin(S3C2440_GPJ9, S3C2440_GPJ9_CAMVSYNC);
1035 +       s3c2410_gpio_cfgpin(S3C2440_GPJ10, S3C2440_GPJ10_CAMHREF);
1036 +       s3c2410_gpio_cfgpin(S3C2440_GPJ11, S3C2440_GPJ11_CAMCLKOUT);
1037 +       s3c2410_gpio_cfgpin(S3C2440_GPJ12, S3C2440_GPJ12_CAMRESET);
1038  #endif
1039          return 0;
1040  }
1041 @@ -827,21 +859,33 @@ int camif_clock_init(camif_gc_t *gc)
1042         camclk_div = (upll+ROUND_ADD) / camclk - 1;
1043         CLKDIVN = (CLKDIVN & 0xFF) | CLKDIVN_CAM(camclk_div);
1044         printk(KERN_INFO"CAMERA:upll %d MACRO 0x%08X CLKDIVN 0x%08X \n",
1045 -                               upll, CLKDIVN_CAM(camclk_div),CLKDIVN);
1046 -       CIIMGCPT = 0;           /* Dummy ? */
1047 +                               upll, CLKDIVN_CAM(camclk_div), CLKDIVN);
1048 +       writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT);  /* Dummy ? */
1049 +
1050         return 0;
1051  }
1052  #else
1053  int camif_clock_init(camif_gc_t *gc)
1054  {
1055 -       unsigned int upll, camclk_div, camclk;
1056 -       if (!gc) camclk = 24000000;
1057 -       else  {
1058 +       unsigned int camclk;
1059 +       struct clk *clk_camif = clk_get(NULL, "camif");
1060 +       struct clk *clk_camif_upll = clk_get(NULL, "camif-upll");
1061 +
1062 +       if (!gc)
1063 +               camclk = 24000000;
1064 +       else {
1065                 camclk = gc->camclk;
1066                 if (camclk > 48000000)
1067                         printk(KERN_ERR "Wrong Camera Clock\n");
1068         }
1069  
1070 +       clk_set_rate(clk_camif, camclk);
1071 +
1072 +       clk_enable(clk_camif);
1073 +       clk_enable(clk_camif_upll);
1074 +       
1075 +
1076 +#if 0
1077         CLKCON |= CLKCON_CAMIF;
1078         upll = elfin_get_bus_clk(GET_UPLL);
1079         printk(KERN_INFO "CAMERA:Default UPLL %08d and Assing 96Mhz to UPLL\n",upll);   
1080 @@ -854,7 +898,9 @@ int camif_clock_init(camif_gc_t *gc)
1081         camclk_div = (upll+ROUND_ADD) /(camclk * 2) -1;
1082         CAMDIVN = CAMCLK_SET_DIV|(camclk_div&0xf);
1083         printk(KERN_INFO "CAMERA:upll %08d  cam_clk %08d CAMDIVN 0x%08x \n",upll,camclk, CAMDIVN);
1084 -       CIIMGCPT = 0;           /* Dummy ? */
1085 +#endif
1086 +       writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT);  /* Dummy ? */
1087 +
1088         return 0;
1089  }
1090  #endif
1091 @@ -867,23 +913,39 @@ void camif_reset(int is, int delay)
1092  {
1093         switch (is) {
1094                 case CAMIF_RESET:
1095 -                       CIGCTRL |= GC_SWRST;
1096 +                       writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) |
1097 +                              GC_SWRST,
1098 +                              camregs + S3C2440_CAM_REG_CIGCTRL);
1099                         mdelay(1);
1100 -                       CIGCTRL &= ~GC_SWRST;
1101 +                       writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) &
1102 +                              ~GC_SWRST,
1103 +                              camregs + S3C2440_CAM_REG_CIGCTRL);
1104                         break;
1105                 case CAMIF_EX_RESET_AH: /*Active High */
1106 -                       CIGCTRL &= ~GC_CAMRST; 
1107 +                       writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) &
1108 +                              ~GC_CAMRST,
1109 +                              camregs + S3C2440_CAM_REG_CIGCTRL);
1110                         udelay(200);
1111 -                       CIGCTRL |= GC_CAMRST;
1112 +                       writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) |
1113 +                              GC_CAMRST,
1114 +                              camregs + S3C2440_CAM_REG_CIGCTRL);
1115                         udelay(delay);
1116 -                       CIGCTRL &= ~GC_CAMRST;
1117 +                       writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) &
1118 +                              ~GC_CAMRST,
1119 +                              camregs + S3C2440_CAM_REG_CIGCTRL);
1120                         break;
1121                 case CAMIF_EX_RESET_AL: /*Active Low */
1122 -                       CIGCTRL |=  GC_CAMRST;
1123 +                       writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) |
1124 +                              GC_CAMRST,
1125 +                              camregs + S3C2440_CAM_REG_CIGCTRL);
1126                         udelay(200);
1127 -                       CIGCTRL &= ~GC_CAMRST;
1128 +                       writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) &
1129 +                              ~GC_CAMRST,
1130 +                              camregs + S3C2440_CAM_REG_CIGCTRL);
1131                         udelay(delay);
1132 -                       CIGCTRL |= GC_CAMRST;
1133 +                       writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) |
1134 +                              GC_CAMRST,
1135 +                              camregs + S3C2440_CAM_REG_CIGCTRL);
1136                         break;
1137                 default:
1138                         break;
1139 @@ -908,10 +970,10 @@ static void camif_bus_priority(int flag)
1140                 PRIORITY1 = PRIORITY_I_FIX;
1141  
1142  #else
1143 -               old_priority = PRIORITY;        
1144 -               PRIORITY &= ~(3<<7);
1145 -               PRIORITY |=  (1<<7); /* Arbiter 1, REQ2 first */
1146 -               PRIORITY &= ~(1<<1); /* Disable Priority Rotate */
1147 +               old_priority = readl(S3C2410_PRIORITY);
1148 +               writel(readl(S3C2410_PRIORITY) & ~(3<<7), S3C2410_PRIORITY);
1149 +               writel(readl(S3C2410_PRIORITY) |  (1<<7), S3C2410_PRIORITY); /* Arbiter 1, REQ2 first */
1150 +               writel(readl(S3C2410_PRIORITY) & ~(1<<1), S3C2410_PRIORITY); /* Disable Priority Rotate */
1151  #endif
1152         } 
1153         else {
1154 @@ -919,19 +981,26 @@ static void camif_bus_priority(int flag)
1155                 PRIORITY0 = old_priority;
1156                 PRIORITY1 = old_priority;
1157  #else
1158 -               PRIORITY = old_priority;
1159 +               writel(old_priority, S3C2410_PRIORITY);
1160  #endif
1161         }
1162  }
1163  
1164  static void inline camif_clock_off(void)
1165  {
1166 -       CIIMGCPT = 0;
1167  #if defined (CONFIG_ARCH_S3C24A0A)
1168 +       writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT);
1169 +
1170         CLKCON &= ~CLKCON_CAM_UPLL;
1171         CLKCON &= ~CLKCON_CAM_HCLK;
1172  #else
1173 -       CLKCON &= ~CLKCON_CAMIF;
1174 +       struct clk *clk_camif = clk_get(NULL, "camif");
1175 +       struct clk *clk_camif_upll = clk_get(NULL, "camif-upll");
1176 +
1177 +       writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT);
1178 +
1179 +       clk_disable(clk_camif);
1180 +       clk_disable(clk_camif_upll);
1181  #endif
1182  }
1183  
1184 diff --git a/arch/arm/mach-s3c2440/camera/camif_fsm.c b/arch/arm/mach-s3c2440/camera/camif_fsm.c
1185 index 3e2b71a..b534aca 100644
1186 --- a/arch/arm/mach-s3c2440/camera/camif_fsm.c
1187 +++ b/arch/arm/mach-s3c2440/camera/camif_fsm.c
1188 @@ -31,7 +31,12 @@
1189  #include <asm/semaphore.h>
1190  #include <linux/miscdevice.h>
1191  
1192 +#define CONFIG_VIDEO_V4L1_COMPAT
1193 +#include <linux/videodev.h>
1194 +#include "camif.h"
1195 +
1196  //#define SW_DEBUG 
1197 +static void camif_start_p_with_c(camif_cfg_t *cfg);
1198  
1199  #include "camif.h"
1200  const char *fsm_version =
1201 diff --git a/arch/arm/mach-s3c2440/camera/imgsensor.c b/arch/arm/mach-s3c2440/camera/imgsensor.c
1202 index 44b7bee..2099b69 100644
1203 --- a/arch/arm/mach-s3c2440/camera/imgsensor.c
1204 +++ b/arch/arm/mach-s3c2440/camera/imgsensor.c
1205 @@ -11,7 +11,7 @@
1206   *  Driver for FIMC20 Camera Decoder 
1207   */
1208  
1209 -#include <linux/config.h>
1210 +
1211  #include <linux/module.h>
1212  #include <linux/kernel.h>
1213  #include <linux/init.h>
1214 @@ -24,10 +24,12 @@
1215  
1216  #ifdef CONFIG_ARCH_S3C24A0A
1217  #else
1218 -#include <asm/arch/S3C2440.h>
1219 +//#include <asm/arch/S3C2440.h>
1220  #endif
1221  
1222  #define SW_DEBUG
1223 +#define CONFIG_VIDEO_V4L1_COMPAT
1224 +#include <linux/videodev.h>
1225  #include "camif.h"
1226  #include "sensor.h"
1227  
1228 @@ -37,10 +39,6 @@
1229  #include "sxga.h"
1230  #endif
1231  
1232 -static const char *sensor_version =
1233 -        "$Id: imgsensor.c,v 1.11 2004/06/10 12:45:40 swlee Exp $";
1234 -
1235 -
1236  static struct i2c_driver s5x532_driver;
1237  static camif_gc_t data = {
1238         itu_fmt:      CAMIF_ITU601,
1239 @@ -69,22 +67,18 @@ static camif_gc_t data = {
1240  
1241  #define CAM_ID 0x5a
1242  
1243 -static unsigned short ignore[] = { I2C_CLIENT_END };
1244 +static unsigned short ignore = I2C_CLIENT_END;
1245  static unsigned short normal_addr[] = { (CAM_ID>>1), I2C_CLIENT_END };
1246  static struct i2c_client_address_data addr_data = {
1247         normal_i2c:             normal_addr,
1248 -       normal_i2c_range:       ignore,
1249 -       probe:                  ignore,
1250 -       probe_range:            ignore,
1251 -       ignore:                 ignore,
1252 -       ignore_range:           ignore,
1253 -       force:                  ignore,
1254 +       probe:                  &ignore,
1255 +       ignore:                 &ignore,
1256  };
1257  
1258  s5x532_t s5x532_regs_mirror[S5X532_REGS];
1259  
1260  unsigned char 
1261 -s5x532_read(struct i2c_client *client,unsigned char subaddr)
1262 +s5x532_read(struct i2c_client *client, unsigned char subaddr)
1263  {
1264         int ret;
1265         unsigned char buf[1];
1266 @@ -151,7 +145,7 @@ void inline s5x532_init(struct i2c_client *sam_client)
1267  }
1268  
1269  static int
1270 -s5x532_attach(struct i2c_adapter *adap, int addr, unsigned short flags,int kind)
1271 +s5x532_attach(struct i2c_adapter *adap, int addr, int kind)
1272  {
1273         struct i2c_client *c;
1274  
1275 @@ -159,13 +153,13 @@ s5x532_attach(struct i2c_adapter *adap, int addr, unsigned short flags,int kind)
1276         if (!c) return -ENOMEM;
1277  
1278         strcpy(c->name, "S5X532");
1279 -       c->id           = s5x532_driver.id;
1280 -       c->flags        = I2C_CLIENT_ALLOW_USE;
1281 +//     c->id           = s5x532_driver.id;
1282 +       c->flags        = 0 /* I2C_CLIENT_ALLOW_USE */;
1283         c->addr         = addr;
1284         c->adapter      = adap;
1285         c->driver       = &s5x532_driver;
1286 -       c->data         = &data;
1287 -       data.sensor     = c; 
1288 +       data.sensor     = c;
1289 +       i2c_set_clientdata(c, &data);
1290  
1291         camif_register_decoder(c);
1292         return i2c_attach_client(c);
1293 @@ -192,10 +186,10 @@ s5x532_command(struct i2c_client *client, unsigned int cmd, void *arg)
1294                  printk(KERN_INFO "CAMERA: S5X532 Sensor initialized\n");
1295                  break;
1296         case USER_ADD:
1297 -               MOD_INC_USE_COUNT;
1298 +               /* MOD_INC_USE_COUNT; uh.. 2.6 deals with this, old-timer */
1299                 break;
1300         case USER_EXIT:
1301 -               MOD_DEC_USE_COUNT;
1302 +               /* MOD_DEC_USE_COUNT; */
1303                 break;
1304  /* Todo
1305         case SENSOR_BRIGHTNESS:
1306 @@ -210,9 +204,8 @@ s5x532_command(struct i2c_client *client, unsigned int cmd, void *arg)
1307  }
1308  
1309  static struct i2c_driver s5x532_driver = {
1310 -       name:           "S5X532",
1311 -       id:             I2C_ALGO_S3C,
1312 -       flags:          I2C_DF_NOTIFY,
1313 +       driver:         { name:         "S5X532" },
1314 +       id:             0, /* optional in i2c-id.h I2C_ALGO_S3C, */
1315         attach_adapter: s5x532_probe,
1316         detach_client:  s5x532_detach,
1317         command:        s5x532_command
1318 @@ -220,11 +213,13 @@ static struct i2c_driver s5x532_driver = {
1319  
1320  static void iic_gpio_port(void) 
1321  {
1322 +/*    FIXME: no gpio config for i2c !!!
1323  #ifdef CONFIG_ARCH_S3C24A0A
1324  #else
1325         GPECON &=  ~(0xf <<28);
1326         GPECON |=    0xa <<28;
1327  #endif
1328 +*/
1329  }
1330  
1331  static __init int camif_sensor_init(void)
1332 diff --git a/arch/arm/mach-s3c2440/camera/qt-driver.c b/arch/arm/mach-s3c2440/camera/qt-driver.c
1333 index 0c5dd40..cbf8565 100644
1334 --- a/arch/arm/mach-s3c2440/camera/qt-driver.c
1335 +++ b/arch/arm/mach-s3c2440/camera/qt-driver.c
1336 @@ -31,12 +31,15 @@
1337                                                                                                             
1338  //#define SW_DEBUG
1339                                                                                                             
1340 +#define CONFIG_VIDEO_V4L1_COMPAT
1341 +#include <linux/videodev.h>
1342  #include "camif.h"
1343 -#include "videodev.h"
1344  #include "miscdevice.h"
1345  #include "cam_reg.h"
1346  #include "sensor.h"
1347  #include "userapp.h"
1348 +
1349 +extern camif_cfg_t * get_camif(int nr);
1350                                                                                                             
1351  
1352  /************************* Sharp Zarus API **************************
1353 diff --git a/arch/arm/mach-s3c2440/camera/video-driver.c b/arch/arm/mach-s3c2440/camera/video-driver.c
1354 index fe9130c..9c77475 100644
1355 --- a/arch/arm/mach-s3c2440/camera/video-driver.c
1356 +++ b/arch/arm/mach-s3c2440/camera/video-driver.c
1357 @@ -29,11 +29,12 @@
1358  #include <asm/irq.h>
1359  #include <asm/semaphore.h>
1360  #include <linux/miscdevice.h>
1361 +#include <asm/arch/irqs.h>
1362  
1363  //#define SW_DEBUG 
1364 -
1365 +#define CONFIG_VIDEO_V4L1_COMPAT
1366 +#include <linux/videodev.h>
1367  #include "camif.h"
1368 -#include "videodev.h"
1369  #include "miscdevice.h"
1370  #include "cam_reg.h"
1371  #include "sensor.h"
1372 @@ -46,12 +47,14 @@
1373  /* Codec and Preview */
1374  #define CAMIF_NUM  2
1375  static camif_cfg_t  fimc[CAMIF_NUM];
1376 +u32 *camregs;
1377  
1378  static const char *driver_version = 
1379         "$Id: video-driver.c,v 1.9 2004/06/02 03:10:36 swlee Exp $";
1380  extern const char *fimc_version;
1381  extern const char *fsm_version;
1382  
1383 +extern void camif_start_c_with_p (camif_cfg_t *cfg, camif_cfg_t *other);
1384  
1385  camif_cfg_t * get_camif(int nr)
1386  {
1387 @@ -177,28 +180,34 @@ camif_c_read(struct file *file, char *buf, size_t count, loff_t *pos)
1388  }
1389  
1390  
1391 -static void camif_c_irq(int irq, void *dev_id, struct pt_regs *regs)
1392 +static irqreturn_t camif_c_irq(int irq, void *dev_id)
1393  {
1394          camif_cfg_t *cfg = (camif_cfg_t *)dev_id;
1395 +
1396         DPRINTK("\n");
1397         camif_g_fifo_status(cfg);
1398         camif_g_frame_num(cfg);
1399 -       if(camif_enter_c_4fsm(cfg) == INSTANT_SKIP) return;
1400 -       wake_up_interruptible(&cfg->waitq);
1401 +       if(camif_enter_c_4fsm(cfg) != INSTANT_SKIP)
1402 +               wake_up_interruptible(&cfg->waitq);
1403 +
1404 +       return IRQ_HANDLED;
1405  }
1406  
1407 -static void camif_p_irq(int irq, void *dev_id, struct pt_regs * regs)
1408 +static irqreturn_t camif_p_irq(int irq, void *dev_id)
1409  {
1410          camif_cfg_t *cfg = (camif_cfg_t *)dev_id;
1411 +
1412         DPRINTK("\n");
1413         camif_g_fifo_status(cfg);
1414         camif_g_frame_num(cfg);
1415 -       if(camif_enter_p_4fsm(cfg) == INSTANT_SKIP) return;
1416 -       wake_up_interruptible(&cfg->waitq);
1417 +       if(camif_enter_p_4fsm(cfg) != INSTANT_SKIP)
1418 +               wake_up_interruptible(&cfg->waitq);
1419  #if 0
1420         if( (cfg->perf.frames % 5) == 0)
1421                 DPRINTK("5\n");
1422  #endif
1423 +
1424 +       return IRQ_HANDLED;
1425  }
1426  
1427  static void camif_release_irq(camif_cfg_t *cfg)
1428 @@ -213,13 +222,13 @@ static int camif_irq_request(camif_cfg_t *cfg)
1429  
1430         if (cfg->dma_type & CAMIF_CODEC) {
1431                 if ((ret = request_irq(cfg->irq, camif_c_irq, 
1432 -                              SA_INTERRUPT,cfg->shortname, cfg))) {
1433 +                              0, cfg->shortname, cfg))) {
1434                         printk("request_irq(CAM_C) failed.\n");
1435                 }
1436         }
1437         if (cfg->dma_type & CAMIF_PREVIEW) {
1438                 if ((ret = request_irq(cfg->irq, camif_p_irq,
1439 -                              SA_INTERRUPT,cfg->shortname, cfg))) {
1440 +                              0, cfg->shortname, cfg))) {
1441                         printk("request_irq(CAM_P) failed.\n");
1442                 }
1443         }
1444 @@ -438,7 +447,7 @@ static struct video_device codec_template =
1445  {
1446         .name     = "CODEC_IF",
1447         .type     = VID_TYPE_CAPTURE|VID_TYPE_CLIPPING|VID_TYPE_SCALES,
1448 -       .hardware = VID_HARDWARE_SAMSUNG_FIMC20,
1449 +/*     .hardware = VID_HARDWARE_SAMSUNG_FIMC20, */
1450         .fops     = &camif_c_fops,
1451  //     .release  = camif_release
1452         .minor    = -1,
1453 @@ -448,7 +457,7 @@ static struct video_device preview_template =
1454  {
1455         .name     = "PREVIEW_IF",
1456         .type     = VID_TYPE_CAPTURE|VID_TYPE_CLIPPING|VID_TYPE_SCALES,
1457 -       .hardware = VID_HARDWARE_SAMSUNG_FIMC20,
1458 +/*     .hardware = VID_HARDWARE_SAMSUNG_FIMC20, */
1459         .fops     = &camif_p_fops,
1460         .minor    = -1,
1461  };
1462 @@ -465,8 +474,8 @@ static int preview_init(camif_cfg_t *cfg)
1463         cfg->fmt      = CAMIF_RGB16;
1464         cfg->flip     = CAMIF_FLIP_Y;
1465         cfg->v        = &preview_template;
1466 -       init_MUTEX(&cfg->v->lock);
1467 -       cfg->irq       = IRQ_CAM_P;
1468 +       mutex_init(&cfg->v->lock);
1469 +       cfg->irq       = IRQ_S3C2440_CAM_P;
1470         
1471         strcpy(cfg->shortname,name);
1472          init_waitqueue_head(&cfg->waitq);
1473 @@ -486,8 +495,8 @@ static int codec_init(camif_cfg_t *cfg)
1474         cfg->fmt      = CAMIF_IN_YCBCR422|CAMIF_OUT_YCBCR420;
1475         cfg->flip     = CAMIF_FLIP_X;
1476         cfg->v         = &codec_template;
1477 -       init_MUTEX(&cfg->v->lock);
1478 -       cfg->irq       = IRQ_CAM_C;
1479 +       mutex_init(&cfg->v->lock);
1480 +       cfg->irq       = IRQ_S3C2440_CAM_C;
1481         strcpy(cfg->shortname,name);
1482         init_waitqueue_head(&cfg->waitq);
1483         cfg->status = CAMIF_STOPPED;
1484 @@ -510,25 +519,44 @@ static void print_version(void)
1485  
1486  static int camif_m_in(void)
1487  {
1488 -       int ret = 0;
1489 +       int ret = -EINVAL;
1490         camif_cfg_t * cfg;
1491  
1492 +       printk(KERN_INFO"Starting S3C2440 Camera Driver\n");
1493 +
1494 +       camregs = ioremap(CAM_BASE_ADD, 0x100);
1495 +       if (!camregs) {
1496 +               printk(KERN_ERR"Unable to map camera regs\n");
1497 +               ret = -ENOMEM;
1498 +               goto bail1;
1499 +       }
1500 +
1501         camif_init();           
1502         cfg = get_camif(CODEC_MINOR);
1503         codec_init(cfg);
1504  
1505 -       if (video_register_device(cfg->v,0,CODEC_MINOR)!=0) {
1506 -                       DPRINTK("Couldn't register codec driver.\n");
1507 -                       return 0;
1508 +       ret = video_register_device(cfg->v,0,CODEC_MINOR);
1509 +       if (ret) {
1510 +                       printk(KERN_ERR"Couldn't register codec driver.\n");
1511 +                       goto bail2;
1512         }
1513         cfg = get_camif(PREVIEW_MINOR);
1514         preview_init(cfg);
1515 -       if (video_register_device(cfg->v,0,PREVIEW_MINOR)!=0) {
1516 -                       DPRINTK("Couldn't register preview driver.\n");
1517 -                       return 0;
1518 +       ret = video_register_device(cfg->v,0,PREVIEW_MINOR);
1519 +       if (ret) {
1520 +                       printk(KERN_ERR"Couldn't register preview driver.\n");
1521 +                       goto bail3; /* hm seems it us unregistered the once */
1522         }
1523         
1524         print_version();
1525 +       return 0;
1526 +
1527 +bail3:
1528 +       video_unregister_device(cfg->v);
1529 +bail2:
1530 +       iounmap(camregs);
1531 +       camregs = NULL;
1532 +bail1:
1533         return ret;
1534  }
1535  
1536 @@ -536,7 +564,9 @@ static void unconfig_device(camif_cfg_t *cfg)
1537  {
1538         video_unregister_device(cfg->v);
1539         camif_hw_close(cfg);
1540 +       iounmap(camregs);
1541         //memset(cfg, 0, sizeof(camif_cfg_t));
1542 +       camregs = NULL;
1543  }
1544  
1545  static void camif_m_out(void)  /* module out */
1546 @@ -547,20 +577,22 @@ static void camif_m_out(void)     /* module out */
1547         unconfig_device(cfg);
1548         cfg = get_camif(PREVIEW_MINOR);
1549         unconfig_device(cfg);
1550 +
1551         return;
1552  }
1553  
1554  void camif_register_decoder(struct i2c_client *ptr)
1555  {
1556         camif_cfg_t *cfg;
1557 +       void * data = i2c_get_clientdata(ptr);
1558  
1559         cfg =get_camif(CODEC_MINOR);
1560 -       cfg->gc = (camif_gc_t *)(ptr->data);
1561 +       cfg->gc = (camif_gc_t *)(data);
1562  
1563         cfg =get_camif(PREVIEW_MINOR);
1564 -       cfg->gc = (camif_gc_t *)(ptr->data);
1565 +       cfg->gc = (camif_gc_t *)(data);
1566  
1567 -       sema_init(&cfg->gc->lock,1); /* global lock for both Codec and Preview */
1568 +       sema_init(&cfg->gc->lock, 1); /* global lock for both Codec and Preview */
1569         cfg->gc->status |= PNOTWORKING; /* Default Value */
1570         camif_hw_open(cfg->gc);
1571  }
1572 @@ -568,8 +600,9 @@ void camif_register_decoder(struct i2c_client *ptr)
1573  void camif_unregister_decoder(struct i2c_client *ptr)
1574  {
1575         camif_gc_t *gc;
1576 +       void * data = i2c_get_clientdata(ptr);
1577                 
1578 -       gc = (camif_gc_t *)(ptr->data); 
1579 +       gc = (camif_gc_t *)(data);
1580         gc->init_sensor = 0; /* need to modify */
1581  }
1582  
1583 diff --git a/arch/arm/mach-s3c2440/camera/videodev.c b/arch/arm/mach-s3c2440/camera/videodev.c
1584 index 0b3498f..6f862e4 100644
1585 --- a/arch/arm/mach-s3c2440/camera/videodev.c
1586 +++ b/arch/arm/mach-s3c2440/camera/videodev.c
1587 @@ -22,7 +22,7 @@
1588  #include <linux/init.h>
1589  #include <linux/kmod.h>
1590  #include <linux/slab.h>
1591 -#include <linux/devfs_fs_kernel.h>
1592 +/* #include <linux/devfs_fs_kernel.h> */
1593  #include <linux/miscdevice.h>
1594  #include <asm/uaccess.h>
1595  #include <asm/system.h>
1596 @@ -30,8 +30,9 @@
1597  
1598  
1599  
1600 +#define CONFIG_VIDEO_V4L1_COMPAT
1601 +#include <linux/videodev.h>
1602  #include "camif.h"
1603 -#include "videodev.h"
1604  #include "miscdevice.h"
1605  
1606  
1607 @@ -42,18 +43,7 @@ const char *fimc_version = "$Id: videodev.c,v 1.1.1.1 2004/04/27 03:52:50 swlee
1608  #define VIDEO_NAME              "video4linux"
1609  
1610  
1611 -static inline unsigned iminor(struct inode *inode)
1612 -{
1613 -        return MINOR(inode->i_rdev);
1614 -}
1615 -
1616 -static inline unsigned imajor(struct inode *inode)
1617 -{
1618 -        return MAJOR(inode->i_rdev);
1619 -}
1620 -
1621 -
1622 -#define VIDEO_NUM_DEVICES      2 
1623 +#define VIDEO_NUM_DEVICES      2
1624  static struct video_device *video_device[VIDEO_NUM_DEVICES];
1625  
1626  static inline struct video_device * get_vd(int nr)
1627 @@ -104,7 +94,7 @@ static int video_open(struct inode *inode, struct file *file)
1628         int minor = MINOR(inode->i_rdev);
1629         int err = 0;
1630         struct video_device *vfl;
1631 -       struct file_operations *old_fops;
1632 +       struct file_operations const *old_fops;
1633         
1634         down(&videodev_lock);
1635  
1636 @@ -131,13 +121,13 @@ extern int video_exclusive_open(struct inode *inode, struct file *file)
1637         struct  video_device *vfl = get_vd(MINOR(inode->i_rdev));
1638         int retval = 0;
1639  
1640 -       down(&vfl->lock);
1641 +       mutex_lock(&vfl->lock);
1642         if (vfl->users) {
1643                 retval = -EBUSY;
1644         } else {
1645                 vfl->users++;
1646         }
1647 -       up(&vfl->lock);
1648 +       mutex_unlock(&vfl->lock);
1649         return retval;
1650  }
1651  
1652 diff --git a/arch/arm/mach-s3c2440/camera/videodev.h b/arch/arm/mach-s3c2440/camera/videodev.h
1653 index f12db43..1c2e35a 100644
1654 --- a/arch/arm/mach-s3c2440/camera/videodev.h
1655 +++ b/arch/arm/mach-s3c2440/camera/videodev.h
1656 @@ -1,11 +1,11 @@
1657 -#ifndef __LINUX_S3C_VIDEODEV_H
1658 -#define __LINUX_S3C_VIDEODEV_H
1659 +//#ifndef __LINUX_S3C_VIDEODEV_H
1660 +//#define __LINUX_S3C_VIDEODEV_H
1661  
1662  #include <linux/types.h>
1663  #include <linux/version.h>
1664 -#include "videodev2.h"
1665 -
1666 +#include <media/v4l2-dev.h>
1667  
1668 +#if 0
1669  struct video_device
1670  {
1671         /* device info */
1672 @@ -96,12 +96,10 @@ extern int video_usercopy(struct inode *inode, struct file *file,
1673  
1674  
1675  
1676 -#define VID_HARDWARE_SAMSUNG_FIMC  255    
1677 -
1678 -
1679 -
1680 -#endif 
1681 +#endif
1682 +//#endif 
1683  
1684 +#define VID_HARDWARE_SAMSUNG_FIMC  255
1685  
1686  /*
1687   * Local variables:
1688 -- 
1689 1.5.6.3
1690