V4L/DVB (11720): gspca - sonixj: Webcam 06f8:3008 added
[linux-2.6] / drivers / media / video / zoran / zr36050.c
1 /*
2  * Zoran ZR36050 basic configuration functions
3  *
4  * Copyright (C) 2001 Wolfgang Scherr <scherr@net4you.at>
5  *
6  * $Id: zr36050.c,v 1.1.2.11 2003/08/03 14:54:53 rbultje Exp $
7  *
8  * ------------------------------------------------------------------------
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  *
24  * ------------------------------------------------------------------------
25  */
26
27 #define ZR050_VERSION "v0.7.1"
28
29 #include <linux/module.h>
30 #include <linux/init.h>
31 #include <linux/slab.h>
32 #include <linux/delay.h>
33
34 #include <linux/types.h>
35 #include <linux/wait.h>
36
37 /* I/O commands, error codes */
38 #include <asm/io.h>
39
40 /* headerfile of this module */
41 #include "zr36050.h"
42
43 /* codec io API */
44 #include "videocodec.h"
45
46 /* it doesn't make sense to have more than 20 or so,
47   just to prevent some unwanted loops */
48 #define MAX_CODECS 20
49
50 /* amount of chips attached via this driver */
51 static int zr36050_codecs;
52
53 /* debugging is available via module parameter */
54 static int debug;
55 module_param(debug, int, 0);
56 MODULE_PARM_DESC(debug, "Debug level (0-4)");
57
58 #define dprintk(num, format, args...) \
59         do { \
60                 if (debug >= num) \
61                         printk(format, ##args); \
62         } while (0)
63
64 /* =========================================================================
65    Local hardware I/O functions:
66
67    read/write via codec layer (registers are located in the master device)
68    ========================================================================= */
69
70 /* read and write functions */
71 static u8
72 zr36050_read (struct zr36050 *ptr,
73               u16             reg)
74 {
75         u8 value = 0;
76
77         // just in case something is wrong...
78         if (ptr->codec->master_data->readreg)
79                 value = (ptr->codec->master_data->readreg(ptr->codec,
80                                                           reg)) & 0xFF;
81         else
82                 dprintk(1,
83                         KERN_ERR "%s: invalid I/O setup, nothing read!\n",
84                         ptr->name);
85
86         dprintk(4, "%s: reading from 0x%04x: %02x\n", ptr->name, reg,
87                 value);
88
89         return value;
90 }
91
92 static void
93 zr36050_write (struct zr36050 *ptr,
94                u16             reg,
95                u8              value)
96 {
97         dprintk(4, "%s: writing 0x%02x to 0x%04x\n", ptr->name, value,
98                 reg);
99
100         // just in case something is wrong...
101         if (ptr->codec->master_data->writereg)
102                 ptr->codec->master_data->writereg(ptr->codec, reg, value);
103         else
104                 dprintk(1,
105                         KERN_ERR
106                         "%s: invalid I/O setup, nothing written!\n",
107                         ptr->name);
108 }
109
110 /* =========================================================================
111    Local helper function:
112
113    status read
114    ========================================================================= */
115
116 /* status is kept in datastructure */
117 static u8
118 zr36050_read_status1 (struct zr36050 *ptr)
119 {
120         ptr->status1 = zr36050_read(ptr, ZR050_STATUS_1);
121
122         zr36050_read(ptr, 0);
123         return ptr->status1;
124 }
125
126 /* =========================================================================
127    Local helper function:
128
129    scale factor read
130    ========================================================================= */
131
132 /* scale factor is kept in datastructure */
133 static u16
134 zr36050_read_scalefactor (struct zr36050 *ptr)
135 {
136         ptr->scalefact = (zr36050_read(ptr, ZR050_SF_HI) << 8) |
137                          (zr36050_read(ptr, ZR050_SF_LO) & 0xFF);
138
139         /* leave 0 selected for an eventually GO from master */
140         zr36050_read(ptr, 0);
141         return ptr->scalefact;
142 }
143
144 /* =========================================================================
145    Local helper function:
146
147    wait if codec is ready to proceed (end of processing) or time is over
148    ========================================================================= */
149
150 static void
151 zr36050_wait_end (struct zr36050 *ptr)
152 {
153         int i = 0;
154
155         while (!(zr36050_read_status1(ptr) & 0x4)) {
156                 udelay(1);
157                 if (i++ > 200000) {     // 200ms, there is for sure something wrong!!!
158                         dprintk(1,
159                                 "%s: timeout at wait_end (last status: 0x%02x)\n",
160                                 ptr->name, ptr->status1);
161                         break;
162                 }
163         }
164 }
165
166 /* =========================================================================
167    Local helper function:
168
169    basic test of "connectivity", writes/reads to/from memory the SOF marker
170    ========================================================================= */
171
172 static int
173 zr36050_basic_test (struct zr36050 *ptr)
174 {
175         zr36050_write(ptr, ZR050_SOF_IDX, 0x00);
176         zr36050_write(ptr, ZR050_SOF_IDX + 1, 0x00);
177         if ((zr36050_read(ptr, ZR050_SOF_IDX) |
178              zr36050_read(ptr, ZR050_SOF_IDX + 1)) != 0x0000) {
179                 dprintk(1,
180                         KERN_ERR
181                         "%s: attach failed, can't connect to jpeg processor!\n",
182                         ptr->name);
183                 return -ENXIO;
184         }
185         zr36050_write(ptr, ZR050_SOF_IDX, 0xff);
186         zr36050_write(ptr, ZR050_SOF_IDX + 1, 0xc0);
187         if (((zr36050_read(ptr, ZR050_SOF_IDX) << 8) |
188              zr36050_read(ptr, ZR050_SOF_IDX + 1)) != 0xffc0) {
189                 dprintk(1,
190                         KERN_ERR
191                         "%s: attach failed, can't connect to jpeg processor!\n",
192                         ptr->name);
193                 return -ENXIO;
194         }
195
196         zr36050_wait_end(ptr);
197         if ((ptr->status1 & 0x4) == 0) {
198                 dprintk(1,
199                         KERN_ERR
200                         "%s: attach failed, jpeg processor failed (end flag)!\n",
201                         ptr->name);
202                 return -EBUSY;
203         }
204
205         return 0;               /* looks good! */
206 }
207
208 /* =========================================================================
209    Local helper function:
210
211    simple loop for pushing the init datasets
212    ========================================================================= */
213
214 static int
215 zr36050_pushit (struct zr36050 *ptr,
216                 u16             startreg,
217                 u16             len,
218                 const char     *data)
219 {
220         int i = 0;
221
222         dprintk(4, "%s: write data block to 0x%04x (len=%d)\n", ptr->name,
223                 startreg, len);
224         while (i < len) {
225                 zr36050_write(ptr, startreg++, data[i++]);
226         }
227
228         return i;
229 }
230
231 /* =========================================================================
232    Basic datasets:
233
234    jpeg baseline setup data (you find it on lots places in internet, or just
235    extract it from any regular .jpg image...)
236
237    Could be variable, but until it's not needed it they are just fixed to save
238    memory. Otherwise expand zr36050 structure with arrays, push the values to
239    it and initalize from there, as e.g. the linux zr36057/60 driver does it.
240    ========================================================================= */
241
242 static const char zr36050_dqt[0x86] = {
243         0xff, 0xdb,             //Marker: DQT
244         0x00, 0x84,             //Length: 2*65+2
245         0x00,                   //Pq,Tq first table
246         0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
247         0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
248         0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
249         0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33,
250         0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44,
251         0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57,
252         0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
253         0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
254         0x01,                   //Pq,Tq second table
255         0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
256         0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
257         0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
258         0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
259         0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
260         0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
261         0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
262         0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63
263 };
264
265 static const char zr36050_dht[0x1a4] = {
266         0xff, 0xc4,             //Marker: DHT
267         0x01, 0xa2,             //Length: 2*AC, 2*DC
268         0x00,                   //DC first table
269         0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
270         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
271         0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
272         0x01,                   //DC second table
273         0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
274         0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
275         0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
276         0x10,                   //AC first table
277         0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
278         0x05, 0x05, 0x04, 0x04, 0x00, 0x00,
279         0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11,
280         0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
281         0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1,
282         0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24,
283         0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17,
284         0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34,
285         0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
286         0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56,
287         0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
288         0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
289         0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
290         0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
291         0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
292         0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9,
293         0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8,
294         0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
295         0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
296         0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
297         0xF8, 0xF9, 0xFA,
298         0x11,                   //AC second table
299         0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
300         0x07, 0x05, 0x04, 0x04, 0x00, 0x01,
301         0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
302         0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
303         0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
304         0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62,
305         0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25,
306         0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A,
307         0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
308         0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56,
309         0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
310         0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
311         0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
312         0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
313         0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
314         0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
315         0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
316         0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8,
317         0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
318         0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
319         0xF9, 0xFA
320 };
321
322 /* jpeg baseline setup, this is just fixed in this driver (YUV pictures) */
323 #define NO_OF_COMPONENTS          0x3   //Y,U,V
324 #define BASELINE_PRECISION        0x8   //MCU size (?)
325 static const char zr36050_tq[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };   //table idx's QT
326 static const char zr36050_td[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };   //table idx's DC
327 static const char zr36050_ta[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };   //table idx's AC
328
329 /* horizontal 422 decimation setup (maybe we support 411 or so later, too) */
330 static const char zr36050_decimation_h[8] = { 2, 1, 1, 0, 0, 0, 0, 0 };
331 static const char zr36050_decimation_v[8] = { 1, 1, 1, 0, 0, 0, 0, 0 };
332
333 /* =========================================================================
334    Local helper functions:
335
336    calculation and setup of parameter-dependent JPEG baseline segments
337    (needed for compression only)
338    ========================================================================= */
339
340 /* ------------------------------------------------------------------------- */
341
342 /* SOF (start of frame) segment depends on width, height and sampling ratio
343                          of each color component */
344
345 static int
346 zr36050_set_sof (struct zr36050 *ptr)
347 {
348         char sof_data[34];      // max. size of register set
349         int i;
350
351         dprintk(3, "%s: write SOF (%dx%d, %d components)\n", ptr->name,
352                 ptr->width, ptr->height, NO_OF_COMPONENTS);
353         sof_data[0] = 0xff;
354         sof_data[1] = 0xc0;
355         sof_data[2] = 0x00;
356         sof_data[3] = (3 * NO_OF_COMPONENTS) + 8;
357         sof_data[4] = BASELINE_PRECISION;       // only '8' possible with zr36050
358         sof_data[5] = (ptr->height) >> 8;
359         sof_data[6] = (ptr->height) & 0xff;
360         sof_data[7] = (ptr->width) >> 8;
361         sof_data[8] = (ptr->width) & 0xff;
362         sof_data[9] = NO_OF_COMPONENTS;
363         for (i = 0; i < NO_OF_COMPONENTS; i++) {
364                 sof_data[10 + (i * 3)] = i;     // index identifier
365                 sof_data[11 + (i * 3)] = (ptr->h_samp_ratio[i] << 4) | (ptr->v_samp_ratio[i]);  // sampling ratios
366                 sof_data[12 + (i * 3)] = zr36050_tq[i]; // Q table selection
367         }
368         return zr36050_pushit(ptr, ZR050_SOF_IDX,
369                               (3 * NO_OF_COMPONENTS) + 10, sof_data);
370 }
371
372 /* ------------------------------------------------------------------------- */
373
374 /* SOS (start of scan) segment depends on the used scan components
375                         of each color component */
376
377 static int
378 zr36050_set_sos (struct zr36050 *ptr)
379 {
380         char sos_data[16];      // max. size of register set
381         int i;
382
383         dprintk(3, "%s: write SOS\n", ptr->name);
384         sos_data[0] = 0xff;
385         sos_data[1] = 0xda;
386         sos_data[2] = 0x00;
387         sos_data[3] = 2 + 1 + (2 * NO_OF_COMPONENTS) + 3;
388         sos_data[4] = NO_OF_COMPONENTS;
389         for (i = 0; i < NO_OF_COMPONENTS; i++) {
390                 sos_data[5 + (i * 2)] = i;      // index
391                 sos_data[6 + (i * 2)] = (zr36050_td[i] << 4) | zr36050_ta[i];   // AC/DC tbl.sel.
392         }
393         sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 2] = 00;      // scan start
394         sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 3] = 0x3F;
395         sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 4] = 00;
396         return zr36050_pushit(ptr, ZR050_SOS1_IDX,
397                               4 + 1 + (2 * NO_OF_COMPONENTS) + 3,
398                               sos_data);
399 }
400
401 /* ------------------------------------------------------------------------- */
402
403 /* DRI (define restart interval) */
404
405 static int
406 zr36050_set_dri (struct zr36050 *ptr)
407 {
408         char dri_data[6];       // max. size of register set
409
410         dprintk(3, "%s: write DRI\n", ptr->name);
411         dri_data[0] = 0xff;
412         dri_data[1] = 0xdd;
413         dri_data[2] = 0x00;
414         dri_data[3] = 0x04;
415         dri_data[4] = ptr->dri >> 8;
416         dri_data[5] = ptr->dri & 0xff;
417         return zr36050_pushit(ptr, ZR050_DRI_IDX, 6, dri_data);
418 }
419
420 /* =========================================================================
421    Setup function:
422
423    Setup compression/decompression of Zoran's JPEG processor
424    ( see also zoran 36050 manual )
425
426    ... sorry for the spaghetti code ...
427    ========================================================================= */
428 static void
429 zr36050_init (struct zr36050 *ptr)
430 {
431         int sum = 0;
432         long bitcnt, tmp;
433
434         if (ptr->mode == CODEC_DO_COMPRESSION) {
435                 dprintk(2, "%s: COMPRESSION SETUP\n", ptr->name);
436
437                 /* 050 communicates with 057 in master mode */
438                 zr36050_write(ptr, ZR050_HARDWARE, ZR050_HW_MSTR);
439
440                 /* encoding table preload for compression */
441                 zr36050_write(ptr, ZR050_MODE,
442                               ZR050_MO_COMP | ZR050_MO_TLM);
443                 zr36050_write(ptr, ZR050_OPTIONS, 0);
444
445                 /* disable all IRQs */
446                 zr36050_write(ptr, ZR050_INT_REQ_0, 0);
447                 zr36050_write(ptr, ZR050_INT_REQ_1, 3); // low 2 bits always 1
448
449                 /* volume control settings */
450                 /*zr36050_write(ptr, ZR050_MBCV, ptr->max_block_vol);*/
451                 zr36050_write(ptr, ZR050_SF_HI, ptr->scalefact >> 8);
452                 zr36050_write(ptr, ZR050_SF_LO, ptr->scalefact & 0xff);
453
454                 zr36050_write(ptr, ZR050_AF_HI, 0xff);
455                 zr36050_write(ptr, ZR050_AF_M, 0xff);
456                 zr36050_write(ptr, ZR050_AF_LO, 0xff);
457
458                 /* setup the variable jpeg tables */
459                 sum += zr36050_set_sof(ptr);
460                 sum += zr36050_set_sos(ptr);
461                 sum += zr36050_set_dri(ptr);
462
463                 /* setup the fixed jpeg tables - maybe variable, though -
464                  * (see table init section above) */
465                 dprintk(3, "%s: write DQT, DHT, APP\n", ptr->name);
466                 sum += zr36050_pushit(ptr, ZR050_DQT_IDX,
467                                       sizeof(zr36050_dqt), zr36050_dqt);
468                 sum += zr36050_pushit(ptr, ZR050_DHT_IDX,
469                                       sizeof(zr36050_dht), zr36050_dht);
470                 zr36050_write(ptr, ZR050_APP_IDX, 0xff);
471                 zr36050_write(ptr, ZR050_APP_IDX + 1, 0xe0 + ptr->app.appn);
472                 zr36050_write(ptr, ZR050_APP_IDX + 2, 0x00);
473                 zr36050_write(ptr, ZR050_APP_IDX + 3, ptr->app.len + 2);
474                 sum += zr36050_pushit(ptr, ZR050_APP_IDX + 4, 60,
475                                       ptr->app.data) + 4;
476                 zr36050_write(ptr, ZR050_COM_IDX, 0xff);
477                 zr36050_write(ptr, ZR050_COM_IDX + 1, 0xfe);
478                 zr36050_write(ptr, ZR050_COM_IDX + 2, 0x00);
479                 zr36050_write(ptr, ZR050_COM_IDX + 3, ptr->com.len + 2);
480                 sum += zr36050_pushit(ptr, ZR050_COM_IDX + 4, 60,
481                                       ptr->com.data) + 4;
482
483                 /* do the internal huffman table preload */
484                 zr36050_write(ptr, ZR050_MARKERS_EN, ZR050_ME_DHTI);
485
486                 zr36050_write(ptr, ZR050_GO, 1);        // launch codec
487                 zr36050_wait_end(ptr);
488                 dprintk(2, "%s: Status after table preload: 0x%02x\n",
489                         ptr->name, ptr->status1);
490
491                 if ((ptr->status1 & 0x4) == 0) {
492                         dprintk(1, KERN_ERR "%s: init aborted!\n",
493                                 ptr->name);
494                         return; // something is wrong, its timed out!!!!
495                 }
496
497                 /* setup misc. data for compression (target code sizes) */
498
499                 /* size of compressed code to reach without header data */
500                 sum = ptr->real_code_vol - sum;
501                 bitcnt = sum << 3;      /* need the size in bits */
502
503                 tmp = bitcnt >> 16;
504                 dprintk(3,
505                         "%s: code: csize=%d, tot=%d, bit=%ld, highbits=%ld\n",
506                         ptr->name, sum, ptr->real_code_vol, bitcnt, tmp);
507                 zr36050_write(ptr, ZR050_TCV_NET_HI, tmp >> 8);
508                 zr36050_write(ptr, ZR050_TCV_NET_MH, tmp & 0xff);
509                 tmp = bitcnt & 0xffff;
510                 zr36050_write(ptr, ZR050_TCV_NET_ML, tmp >> 8);
511                 zr36050_write(ptr, ZR050_TCV_NET_LO, tmp & 0xff);
512
513                 bitcnt -= bitcnt >> 7;  // bits without stuffing
514                 bitcnt -= ((bitcnt * 5) >> 6);  // bits without eob
515
516                 tmp = bitcnt >> 16;
517                 dprintk(3, "%s: code: nettobit=%ld, highnettobits=%ld\n",
518                         ptr->name, bitcnt, tmp);
519                 zr36050_write(ptr, ZR050_TCV_DATA_HI, tmp >> 8);
520                 zr36050_write(ptr, ZR050_TCV_DATA_MH, tmp & 0xff);
521                 tmp = bitcnt & 0xffff;
522                 zr36050_write(ptr, ZR050_TCV_DATA_ML, tmp >> 8);
523                 zr36050_write(ptr, ZR050_TCV_DATA_LO, tmp & 0xff);
524
525                 /* compression setup with or without bitrate control */
526                 zr36050_write(ptr, ZR050_MODE,
527                               ZR050_MO_COMP | ZR050_MO_PASS2 |
528                               (ptr->bitrate_ctrl ? ZR050_MO_BRC : 0));
529
530                 /* this headers seem to deliver "valid AVI" jpeg frames */
531                 zr36050_write(ptr, ZR050_MARKERS_EN,
532                               ZR050_ME_DQT | ZR050_ME_DHT |
533                               ((ptr->app.len > 0) ? ZR050_ME_APP : 0) |
534                               ((ptr->com.len > 0) ? ZR050_ME_COM : 0));
535         } else {
536                 dprintk(2, "%s: EXPANSION SETUP\n", ptr->name);
537
538                 /* 050 communicates with 055 in master mode */
539                 zr36050_write(ptr, ZR050_HARDWARE,
540                               ZR050_HW_MSTR | ZR050_HW_CFIS_2_CLK);
541
542                 /* encoding table preload */
543                 zr36050_write(ptr, ZR050_MODE, ZR050_MO_TLM);
544
545                 /* disable all IRQs */
546                 zr36050_write(ptr, ZR050_INT_REQ_0, 0);
547                 zr36050_write(ptr, ZR050_INT_REQ_1, 3); // low 2 bits always 1
548
549                 dprintk(3, "%s: write DHT\n", ptr->name);
550                 zr36050_pushit(ptr, ZR050_DHT_IDX, sizeof(zr36050_dht),
551                                zr36050_dht);
552
553                 /* do the internal huffman table preload */
554                 zr36050_write(ptr, ZR050_MARKERS_EN, ZR050_ME_DHTI);
555
556                 zr36050_write(ptr, ZR050_GO, 1);        // launch codec
557                 zr36050_wait_end(ptr);
558                 dprintk(2, "%s: Status after table preload: 0x%02x\n",
559                         ptr->name, ptr->status1);
560
561                 if ((ptr->status1 & 0x4) == 0) {
562                         dprintk(1, KERN_ERR "%s: init aborted!\n",
563                                 ptr->name);
564                         return; // something is wrong, its timed out!!!!
565                 }
566
567                 /* setup misc. data for expansion */
568                 zr36050_write(ptr, ZR050_MODE, 0);
569                 zr36050_write(ptr, ZR050_MARKERS_EN, 0);
570         }
571
572         /* adr on selected, to allow GO from master */
573         zr36050_read(ptr, 0);
574 }
575
576 /* =========================================================================
577    CODEC API FUNCTIONS
578
579    this functions are accessed by the master via the API structure
580    ========================================================================= */
581
582 /* set compression/expansion mode and launches codec -
583    this should be the last call from the master before starting processing */
584 static int
585 zr36050_set_mode (struct videocodec *codec,
586                   int                mode)
587 {
588         struct zr36050 *ptr = (struct zr36050 *) codec->data;
589
590         dprintk(2, "%s: set_mode %d call\n", ptr->name, mode);
591
592         if ((mode != CODEC_DO_EXPANSION) && (mode != CODEC_DO_COMPRESSION))
593                 return -EINVAL;
594
595         ptr->mode = mode;
596         zr36050_init(ptr);
597
598         return 0;
599 }
600
601 /* set picture size (norm is ignored as the codec doesn't know about it) */
602 static int
603 zr36050_set_video (struct videocodec   *codec,
604                    struct tvnorm       *norm,
605                    struct vfe_settings *cap,
606                    struct vfe_polarity *pol)
607 {
608         struct zr36050 *ptr = (struct zr36050 *) codec->data;
609         int size;
610
611         dprintk(2, "%s: set_video %d.%d, %d/%d-%dx%d (0x%x) q%d call\n",
612                 ptr->name, norm->HStart, norm->VStart,
613                 cap->x, cap->y, cap->width, cap->height,
614                 cap->decimation, cap->quality);
615         /* if () return -EINVAL;
616          * trust the master driver that it knows what it does - so
617          * we allow invalid startx/y and norm for now ... */
618         ptr->width = cap->width / (cap->decimation & 0xff);
619         ptr->height = cap->height / ((cap->decimation >> 8) & 0xff);
620
621         /* (KM) JPEG quality */
622         size = ptr->width * ptr->height;
623         size *= 16; /* size in bits */
624         /* apply quality setting */
625         size = size * cap->quality / 200;
626
627         /* Minimum: 1kb */
628         if (size < 8192)
629                 size = 8192;
630         /* Maximum: 7/8 of code buffer */
631         if (size > ptr->total_code_vol * 7)
632                 size = ptr->total_code_vol * 7;
633
634         ptr->real_code_vol = size >> 3; /* in bytes */
635
636         /* Set max_block_vol here (previously in zr36050_init, moved
637          * here for consistency with zr36060 code */
638         zr36050_write(ptr, ZR050_MBCV, ptr->max_block_vol);
639
640         return 0;
641 }
642
643 /* additional control functions */
644 static int
645 zr36050_control (struct videocodec *codec,
646                  int                type,
647                  int                size,
648                  void              *data)
649 {
650         struct zr36050 *ptr = (struct zr36050 *) codec->data;
651         int *ival = (int *) data;
652
653         dprintk(2, "%s: control %d call with %d byte\n", ptr->name, type,
654                 size);
655
656         switch (type) {
657         case CODEC_G_STATUS:    /* get last status */
658                 if (size != sizeof(int))
659                         return -EFAULT;
660                 zr36050_read_status1(ptr);
661                 *ival = ptr->status1;
662                 break;
663
664         case CODEC_G_CODEC_MODE:
665                 if (size != sizeof(int))
666                         return -EFAULT;
667                 *ival = CODEC_MODE_BJPG;
668                 break;
669
670         case CODEC_S_CODEC_MODE:
671                 if (size != sizeof(int))
672                         return -EFAULT;
673                 if (*ival != CODEC_MODE_BJPG)
674                         return -EINVAL;
675                 /* not needed, do nothing */
676                 return 0;
677
678         case CODEC_G_VFE:
679         case CODEC_S_VFE:
680                 /* not needed, do nothing */
681                 return 0;
682
683         case CODEC_S_MMAP:
684                 /* not available, give an error */
685                 return -ENXIO;
686
687         case CODEC_G_JPEG_TDS_BYTE:     /* get target volume in byte */
688                 if (size != sizeof(int))
689                         return -EFAULT;
690                 *ival = ptr->total_code_vol;
691                 break;
692
693         case CODEC_S_JPEG_TDS_BYTE:     /* get target volume in byte */
694                 if (size != sizeof(int))
695                         return -EFAULT;
696                 ptr->total_code_vol = *ival;
697                 /* (Kieran Morrissey)
698                  * code copied from zr36060.c to ensure proper bitrate */
699                 ptr->real_code_vol = (ptr->total_code_vol * 6) >> 3;
700                 break;
701
702         case CODEC_G_JPEG_SCALE:        /* get scaling factor */
703                 if (size != sizeof(int))
704                         return -EFAULT;
705                 *ival = zr36050_read_scalefactor(ptr);
706                 break;
707
708         case CODEC_S_JPEG_SCALE:        /* set scaling factor */
709                 if (size != sizeof(int))
710                         return -EFAULT;
711                 ptr->scalefact = *ival;
712                 break;
713
714         case CODEC_G_JPEG_APP_DATA: {   /* get appn marker data */
715                 struct jpeg_app_marker *app = data;
716
717                 if (size != sizeof(struct jpeg_app_marker))
718                         return -EFAULT;
719
720                 *app = ptr->app;
721                 break;
722         }
723
724         case CODEC_S_JPEG_APP_DATA: {    /* set appn marker data */
725                 struct jpeg_app_marker *app = data;
726
727                 if (size != sizeof(struct jpeg_app_marker))
728                         return -EFAULT;
729
730                 ptr->app = *app;
731                 break;
732         }
733
734         case CODEC_G_JPEG_COM_DATA: {   /* get comment marker data */
735                 struct jpeg_com_marker *com = data;
736
737                 if (size != sizeof(struct jpeg_com_marker))
738                         return -EFAULT;
739
740                 *com = ptr->com;
741                 break;
742         }
743
744         case CODEC_S_JPEG_COM_DATA: {   /* set comment marker data */
745                 struct jpeg_com_marker *com = data;
746
747                 if (size != sizeof(struct jpeg_com_marker))
748                         return -EFAULT;
749
750                 ptr->com = *com;
751                 break;
752         }
753
754         default:
755                 return -EINVAL;
756         }
757
758         return size;
759 }
760
761 /* =========================================================================
762    Exit and unregister function:
763
764    Deinitializes Zoran's JPEG processor
765    ========================================================================= */
766
767 static int
768 zr36050_unset (struct videocodec *codec)
769 {
770         struct zr36050 *ptr = codec->data;
771
772         if (ptr) {
773                 /* do wee need some codec deinit here, too ???? */
774
775                 dprintk(1, "%s: finished codec #%d\n", ptr->name,
776                         ptr->num);
777                 kfree(ptr);
778                 codec->data = NULL;
779
780                 zr36050_codecs--;
781                 return 0;
782         }
783
784         return -EFAULT;
785 }
786
787 /* =========================================================================
788    Setup and registry function:
789
790    Initializes Zoran's JPEG processor
791
792    Also sets pixel size, average code size, mode (compr./decompr.)
793    (the given size is determined by the processor with the video interface)
794    ========================================================================= */
795
796 static int
797 zr36050_setup (struct videocodec *codec)
798 {
799         struct zr36050 *ptr;
800         int res;
801
802         dprintk(2, "zr36050: initializing MJPEG subsystem #%d.\n",
803                 zr36050_codecs);
804
805         if (zr36050_codecs == MAX_CODECS) {
806                 dprintk(1,
807                         KERN_ERR "zr36050: Can't attach more codecs!\n");
808                 return -ENOSPC;
809         }
810         //mem structure init
811         codec->data = ptr = kzalloc(sizeof(struct zr36050), GFP_KERNEL);
812         if (NULL == ptr) {
813                 dprintk(1, KERN_ERR "zr36050: Can't get enough memory!\n");
814                 return -ENOMEM;
815         }
816
817         snprintf(ptr->name, sizeof(ptr->name), "zr36050[%d]",
818                  zr36050_codecs);
819         ptr->num = zr36050_codecs++;
820         ptr->codec = codec;
821
822         //testing
823         res = zr36050_basic_test(ptr);
824         if (res < 0) {
825                 zr36050_unset(codec);
826                 return res;
827         }
828         //final setup
829         memcpy(ptr->h_samp_ratio, zr36050_decimation_h, 8);
830         memcpy(ptr->v_samp_ratio, zr36050_decimation_v, 8);
831
832         ptr->bitrate_ctrl = 0;  /* 0 or 1 - fixed file size flag
833                                  * (what is the difference?) */
834         ptr->mode = CODEC_DO_COMPRESSION;
835         ptr->width = 384;
836         ptr->height = 288;
837         ptr->total_code_vol = 16000;
838         ptr->max_block_vol = 240;
839         ptr->scalefact = 0x100;
840         ptr->dri = 1;
841
842         /* no app/com marker by default */
843         ptr->app.appn = 0;
844         ptr->app.len = 0;
845         ptr->com.len = 0;
846
847         zr36050_init(ptr);
848
849         dprintk(1, KERN_INFO "%s: codec attached and running\n",
850                 ptr->name);
851
852         return 0;
853 }
854
855 static const struct videocodec zr36050_codec = {
856         .owner = THIS_MODULE,
857         .name = "zr36050",
858         .magic = 0L,            // magic not used
859         .flags =
860             CODEC_FLAG_JPEG | CODEC_FLAG_HARDWARE | CODEC_FLAG_ENCODER |
861             CODEC_FLAG_DECODER,
862         .type = CODEC_TYPE_ZR36050,
863         .setup = zr36050_setup, // functionality
864         .unset = zr36050_unset,
865         .set_mode = zr36050_set_mode,
866         .set_video = zr36050_set_video,
867         .control = zr36050_control,
868         // others are not used
869 };
870
871 /* =========================================================================
872    HOOK IN DRIVER AS KERNEL MODULE
873    ========================================================================= */
874
875 static int __init
876 zr36050_init_module (void)
877 {
878         //dprintk(1, "ZR36050 driver %s\n",ZR050_VERSION);
879         zr36050_codecs = 0;
880         return videocodec_register(&zr36050_codec);
881 }
882
883 static void __exit
884 zr36050_cleanup_module (void)
885 {
886         if (zr36050_codecs) {
887                 dprintk(1,
888                         "zr36050: something's wrong - %d codecs left somehow.\n",
889                         zr36050_codecs);
890         }
891         videocodec_unregister(&zr36050_codec);
892 }
893
894 module_init(zr36050_init_module);
895 module_exit(zr36050_cleanup_module);
896
897 MODULE_AUTHOR("Wolfgang Scherr <scherr@net4you.at>");
898 MODULE_DESCRIPTION("Driver module for ZR36050 jpeg processors "
899                    ZR050_VERSION);
900 MODULE_LICENSE("GPL");