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