xref: /linux/drivers/media/pci/zoran/zr36060.c (revision e5451c8f8330e03ad3cfa16048b4daf961af434f)
1 /*
2  * Zoran ZR36060 basic configuration functions
3  *
4  * Copyright (C) 2002 Laurent Pinchart <laurent.pinchart@skynet.be>
5  *
6  * $Id: zr36060.c,v 1.1.2.22 2003/05/06 09:35:36 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 ZR060_VERSION "v0.7"
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 "zr36060.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 zr36060_codecs;
52 
53 static bool low_bitrate;
54 module_param(low_bitrate, bool, 0);
55 MODULE_PARM_DESC(low_bitrate, "Buz compatibility option, halves bitrate");
56 
57 /* debugging is available via module parameter */
58 static int debug;
59 module_param(debug, int, 0);
60 MODULE_PARM_DESC(debug, "Debug level (0-4)");
61 
62 #define dprintk(num, format, args...) \
63 	do { \
64 		if (debug >= num) \
65 			printk(format, ##args); \
66 	} while (0)
67 
68 /* =========================================================================
69    Local hardware I/O functions:
70 
71    read/write via codec layer (registers are located in the master device)
72    ========================================================================= */
73 
74 /* read and write functions */
75 static u8
76 zr36060_read (struct zr36060 *ptr,
77 	      u16             reg)
78 {
79 	u8 value = 0;
80 
81 	// just in case something is wrong...
82 	if (ptr->codec->master_data->readreg)
83 		value = (ptr->codec->master_data->readreg(ptr->codec,
84 							  reg)) & 0xff;
85 	else
86 		dprintk(1,
87 			KERN_ERR "%s: invalid I/O setup, nothing read!\n",
88 			ptr->name);
89 
90 	//dprintk(4, "%s: reading from 0x%04x: %02x\n",ptr->name,reg,value);
91 
92 	return value;
93 }
94 
95 static void
96 zr36060_write(struct zr36060 *ptr,
97 	      u16             reg,
98 	      u8              value)
99 {
100 	//dprintk(4, "%s: writing 0x%02x to 0x%04x\n",ptr->name,value,reg);
101 	dprintk(4, "0x%02x @0x%04x\n", value, reg);
102 
103 	// just in case something is wrong...
104 	if (ptr->codec->master_data->writereg)
105 		ptr->codec->master_data->writereg(ptr->codec, reg, value);
106 	else
107 		dprintk(1,
108 			KERN_ERR
109 			"%s: invalid I/O setup, nothing written!\n",
110 			ptr->name);
111 }
112 
113 /* =========================================================================
114    Local helper function:
115 
116    status read
117    ========================================================================= */
118 
119 /* status is kept in datastructure */
120 static u8
121 zr36060_read_status (struct zr36060 *ptr)
122 {
123 	ptr->status = zr36060_read(ptr, ZR060_CFSR);
124 
125 	zr36060_read(ptr, 0);
126 	return ptr->status;
127 }
128 
129 /* =========================================================================
130    Local helper function:
131 
132    scale factor read
133    ========================================================================= */
134 
135 /* scale factor is kept in datastructure */
136 static u16
137 zr36060_read_scalefactor (struct zr36060 *ptr)
138 {
139 	ptr->scalefact = (zr36060_read(ptr, ZR060_SF_HI) << 8) |
140 			 (zr36060_read(ptr, ZR060_SF_LO) & 0xFF);
141 
142 	/* leave 0 selected for an eventually GO from master */
143 	zr36060_read(ptr, 0);
144 	return ptr->scalefact;
145 }
146 
147 /* =========================================================================
148    Local helper function:
149 
150    wait if codec is ready to proceed (end of processing) or time is over
151    ========================================================================= */
152 
153 static void
154 zr36060_wait_end (struct zr36060 *ptr)
155 {
156 	int i = 0;
157 
158 	while (zr36060_read_status(ptr) & ZR060_CFSR_Busy) {
159 		udelay(1);
160 		if (i++ > 200000) {	// 200ms, there is for sure something wrong!!!
161 			dprintk(1,
162 				"%s: timeout at wait_end (last status: 0x%02x)\n",
163 				ptr->name, ptr->status);
164 			break;
165 		}
166 	}
167 }
168 
169 /* =========================================================================
170    Local helper function:
171 
172    basic test of "connectivity", writes/reads to/from memory the SOF marker
173    ========================================================================= */
174 
175 static int
176 zr36060_basic_test (struct zr36060 *ptr)
177 {
178 	if ((zr36060_read(ptr, ZR060_IDR_DEV) != 0x33) &&
179 	    (zr36060_read(ptr, ZR060_IDR_REV) != 0x01)) {
180 		dprintk(1,
181 			KERN_ERR
182 			"%s: attach failed, can't connect to jpeg processor!\n",
183 			ptr->name);
184 		return -ENXIO;
185 	}
186 
187 	zr36060_wait_end(ptr);
188 	if (ptr->status & ZR060_CFSR_Busy) {
189 		dprintk(1,
190 			KERN_ERR
191 			"%s: attach failed, jpeg processor failed (end flag)!\n",
192 			ptr->name);
193 		return -EBUSY;
194 	}
195 
196 	return 0;		/* looks good! */
197 }
198 
199 /* =========================================================================
200    Local helper function:
201 
202    simple loop for pushing the init datasets
203    ========================================================================= */
204 
205 static int
206 zr36060_pushit (struct zr36060 *ptr,
207 		u16             startreg,
208 		u16             len,
209 		const char     *data)
210 {
211 	int i = 0;
212 
213 	dprintk(4, "%s: write data block to 0x%04x (len=%d)\n", ptr->name,
214 		startreg, len);
215 	while (i < len) {
216 		zr36060_write(ptr, startreg++, data[i++]);
217 	}
218 
219 	return i;
220 }
221 
222 /* =========================================================================
223    Basic datasets:
224 
225    jpeg baseline setup data (you find it on lots places in internet, or just
226    extract it from any regular .jpg image...)
227 
228    Could be variable, but until it's not needed it they are just fixed to save
229    memory. Otherwise expand zr36060 structure with arrays, push the values to
230    it and initialize from there, as e.g. the linux zr36057/60 driver does it.
231    ========================================================================= */
232 
233 static const char zr36060_dqt[0x86] = {
234 	0xff, 0xdb,		//Marker: DQT
235 	0x00, 0x84,		//Length: 2*65+2
236 	0x00,			//Pq,Tq first table
237 	0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
238 	0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
239 	0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
240 	0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33,
241 	0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44,
242 	0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57,
243 	0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
244 	0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
245 	0x01,			//Pq,Tq second table
246 	0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
247 	0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
248 	0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
249 	0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
250 	0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
251 	0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
252 	0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
253 	0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63
254 };
255 
256 static const char zr36060_dht[0x1a4] = {
257 	0xff, 0xc4,		//Marker: DHT
258 	0x01, 0xa2,		//Length: 2*AC, 2*DC
259 	0x00,			//DC first table
260 	0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
261 	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
262 	0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
263 	0x01,			//DC second table
264 	0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
265 	0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
266 	0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
267 	0x10,			//AC first table
268 	0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
269 	0x05, 0x05, 0x04, 0x04, 0x00, 0x00,
270 	0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11,
271 	0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
272 	0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1,
273 	0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24,
274 	0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17,
275 	0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34,
276 	0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
277 	0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56,
278 	0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
279 	0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
280 	0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
281 	0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
282 	0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
283 	0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9,
284 	0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8,
285 	0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
286 	0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
287 	0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
288 	0xF8, 0xF9, 0xFA,
289 	0x11,			//AC second table
290 	0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
291 	0x07, 0x05, 0x04, 0x04, 0x00, 0x01,
292 	0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
293 	0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
294 	0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
295 	0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62,
296 	0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25,
297 	0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A,
298 	0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
299 	0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56,
300 	0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
301 	0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
302 	0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
303 	0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
304 	0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
305 	0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
306 	0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
307 	0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8,
308 	0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
309 	0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
310 	0xF9, 0xFA
311 };
312 
313 /* jpeg baseline setup, this is just fixed in this driver (YUV pictures) */
314 #define NO_OF_COMPONENTS          0x3	//Y,U,V
315 #define BASELINE_PRECISION        0x8	//MCU size (?)
316 static const char zr36060_tq[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };	//table idx's QT
317 static const char zr36060_td[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };	//table idx's DC
318 static const char zr36060_ta[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };	//table idx's AC
319 
320 /* horizontal 422 decimation setup (maybe we support 411 or so later, too) */
321 static const char zr36060_decimation_h[8] = { 2, 1, 1, 0, 0, 0, 0, 0 };
322 static const char zr36060_decimation_v[8] = { 1, 1, 1, 0, 0, 0, 0, 0 };
323 
324 /* =========================================================================
325    Local helper functions:
326 
327    calculation and setup of parameter-dependent JPEG baseline segments
328    (needed for compression only)
329    ========================================================================= */
330 
331 /* ------------------------------------------------------------------------- */
332 
333 /* SOF (start of frame) segment depends on width, height and sampling ratio
334 			 of each color component */
335 
336 static int
337 zr36060_set_sof (struct zr36060 *ptr)
338 {
339 	char sof_data[34];	// max. size of register set
340 	int i;
341 
342 	dprintk(3, "%s: write SOF (%dx%d, %d components)\n", ptr->name,
343 		ptr->width, ptr->height, NO_OF_COMPONENTS);
344 	sof_data[0] = 0xff;
345 	sof_data[1] = 0xc0;
346 	sof_data[2] = 0x00;
347 	sof_data[3] = (3 * NO_OF_COMPONENTS) + 8;
348 	sof_data[4] = BASELINE_PRECISION;	// only '8' possible with zr36060
349 	sof_data[5] = (ptr->height) >> 8;
350 	sof_data[6] = (ptr->height) & 0xff;
351 	sof_data[7] = (ptr->width) >> 8;
352 	sof_data[8] = (ptr->width) & 0xff;
353 	sof_data[9] = NO_OF_COMPONENTS;
354 	for (i = 0; i < NO_OF_COMPONENTS; i++) {
355 		sof_data[10 + (i * 3)] = i;	// index identifier
356 		sof_data[11 + (i * 3)] = (ptr->h_samp_ratio[i] << 4) |
357 					 (ptr->v_samp_ratio[i]); // sampling ratios
358 		sof_data[12 + (i * 3)] = zr36060_tq[i];	// Q table selection
359 	}
360 	return zr36060_pushit(ptr, ZR060_SOF_IDX,
361 			      (3 * NO_OF_COMPONENTS) + 10, sof_data);
362 }
363 
364 /* ------------------------------------------------------------------------- */
365 
366 /* SOS (start of scan) segment depends on the used scan components
367 			of each color component */
368 
369 static int
370 zr36060_set_sos (struct zr36060 *ptr)
371 {
372 	char sos_data[16];	// max. size of register set
373 	int i;
374 
375 	dprintk(3, "%s: write SOS\n", ptr->name);
376 	sos_data[0] = 0xff;
377 	sos_data[1] = 0xda;
378 	sos_data[2] = 0x00;
379 	sos_data[3] = 2 + 1 + (2 * NO_OF_COMPONENTS) + 3;
380 	sos_data[4] = NO_OF_COMPONENTS;
381 	for (i = 0; i < NO_OF_COMPONENTS; i++) {
382 		sos_data[5 + (i * 2)] = i;	// index
383 		sos_data[6 + (i * 2)] = (zr36060_td[i] << 4) |
384 					zr36060_ta[i]; // AC/DC tbl.sel.
385 	}
386 	sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 2] = 00;	// scan start
387 	sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 3] = 0x3f;
388 	sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 4] = 00;
389 	return zr36060_pushit(ptr, ZR060_SOS_IDX,
390 			      4 + 1 + (2 * NO_OF_COMPONENTS) + 3,
391 			      sos_data);
392 }
393 
394 /* ------------------------------------------------------------------------- */
395 
396 /* DRI (define restart interval) */
397 
398 static int
399 zr36060_set_dri (struct zr36060 *ptr)
400 {
401 	char dri_data[6];	// max. size of register set
402 
403 	dprintk(3, "%s: write DRI\n", ptr->name);
404 	dri_data[0] = 0xff;
405 	dri_data[1] = 0xdd;
406 	dri_data[2] = 0x00;
407 	dri_data[3] = 0x04;
408 	dri_data[4] = (ptr->dri) >> 8;
409 	dri_data[5] = (ptr->dri) & 0xff;
410 	return zr36060_pushit(ptr, ZR060_DRI_IDX, 6, dri_data);
411 }
412 
413 /* =========================================================================
414    Setup function:
415 
416    Setup compression/decompression of Zoran's JPEG processor
417    ( see also zoran 36060 manual )
418 
419    ... sorry for the spaghetti code ...
420    ========================================================================= */
421 static void
422 zr36060_init (struct zr36060 *ptr)
423 {
424 	int sum = 0;
425 	long bitcnt, tmp;
426 
427 	if (ptr->mode == CODEC_DO_COMPRESSION) {
428 		dprintk(2, "%s: COMPRESSION SETUP\n", ptr->name);
429 
430 		zr36060_write(ptr, ZR060_LOAD, ZR060_LOAD_SyncRst);
431 
432 		/* 060 communicates with 067 in master mode */
433 		zr36060_write(ptr, ZR060_CIR, ZR060_CIR_CodeMstr);
434 
435 		/* Compression with or without variable scale factor */
436 		/*FIXME: What about ptr->bitrate_ctrl? */
437 		zr36060_write(ptr, ZR060_CMR,
438 			      ZR060_CMR_Comp | ZR060_CMR_Pass2 |
439 			      ZR060_CMR_BRB);
440 
441 		/* Must be zero */
442 		zr36060_write(ptr, ZR060_MBZ, 0x00);
443 		zr36060_write(ptr, ZR060_TCR_HI, 0x00);
444 		zr36060_write(ptr, ZR060_TCR_LO, 0x00);
445 
446 		/* Disable all IRQs - no DataErr means autoreset */
447 		zr36060_write(ptr, ZR060_IMR, 0);
448 
449 		/* volume control settings */
450 		zr36060_write(ptr, ZR060_SF_HI, ptr->scalefact >> 8);
451 		zr36060_write(ptr, ZR060_SF_LO, ptr->scalefact & 0xff);
452 
453 		zr36060_write(ptr, ZR060_AF_HI, 0xff);
454 		zr36060_write(ptr, ZR060_AF_M, 0xff);
455 		zr36060_write(ptr, ZR060_AF_LO, 0xff);
456 
457 		/* setup the variable jpeg tables */
458 		sum += zr36060_set_sof(ptr);
459 		sum += zr36060_set_sos(ptr);
460 		sum += zr36060_set_dri(ptr);
461 
462 		/* setup the fixed jpeg tables - maybe variable, though -
463 		 * (see table init section above) */
464 		sum +=
465 		    zr36060_pushit(ptr, ZR060_DQT_IDX, sizeof(zr36060_dqt),
466 				   zr36060_dqt);
467 		sum +=
468 		    zr36060_pushit(ptr, ZR060_DHT_IDX, sizeof(zr36060_dht),
469 				   zr36060_dht);
470 		zr36060_write(ptr, ZR060_APP_IDX, 0xff);
471 		zr36060_write(ptr, ZR060_APP_IDX + 1, 0xe0 + ptr->app.appn);
472 		zr36060_write(ptr, ZR060_APP_IDX + 2, 0x00);
473 		zr36060_write(ptr, ZR060_APP_IDX + 3, ptr->app.len + 2);
474 		sum += zr36060_pushit(ptr, ZR060_APP_IDX + 4, 60,
475 				      ptr->app.data) + 4;
476 		zr36060_write(ptr, ZR060_COM_IDX, 0xff);
477 		zr36060_write(ptr, ZR060_COM_IDX + 1, 0xfe);
478 		zr36060_write(ptr, ZR060_COM_IDX + 2, 0x00);
479 		zr36060_write(ptr, ZR060_COM_IDX + 3, ptr->com.len + 2);
480 		sum += zr36060_pushit(ptr, ZR060_COM_IDX + 4, 60,
481 				      ptr->com.data) + 4;
482 
483 		/* setup misc. data for compression (target code sizes) */
484 
485 		/* size of compressed code to reach without header data */
486 		sum = ptr->real_code_vol - sum;
487 		bitcnt = sum << 3;	/* need the size in bits */
488 
489 		tmp = bitcnt >> 16;
490 		dprintk(3,
491 			"%s: code: csize=%d, tot=%d, bit=%ld, highbits=%ld\n",
492 			ptr->name, sum, ptr->real_code_vol, bitcnt, tmp);
493 		zr36060_write(ptr, ZR060_TCV_NET_HI, tmp >> 8);
494 		zr36060_write(ptr, ZR060_TCV_NET_MH, tmp & 0xff);
495 		tmp = bitcnt & 0xffff;
496 		zr36060_write(ptr, ZR060_TCV_NET_ML, tmp >> 8);
497 		zr36060_write(ptr, ZR060_TCV_NET_LO, tmp & 0xff);
498 
499 		bitcnt -= bitcnt >> 7;	// bits without stuffing
500 		bitcnt -= ((bitcnt * 5) >> 6);	// bits without eob
501 
502 		tmp = bitcnt >> 16;
503 		dprintk(3, "%s: code: nettobit=%ld, highnettobits=%ld\n",
504 			ptr->name, bitcnt, tmp);
505 		zr36060_write(ptr, ZR060_TCV_DATA_HI, tmp >> 8);
506 		zr36060_write(ptr, ZR060_TCV_DATA_MH, tmp & 0xff);
507 		tmp = bitcnt & 0xffff;
508 		zr36060_write(ptr, ZR060_TCV_DATA_ML, tmp >> 8);
509 		zr36060_write(ptr, ZR060_TCV_DATA_LO, tmp & 0xff);
510 
511 		/* JPEG markers to be included in the compressed stream */
512 		zr36060_write(ptr, ZR060_MER,
513 			      ZR060_MER_DQT | ZR060_MER_DHT |
514 			      ((ptr->com.len > 0) ? ZR060_MER_Com : 0) |
515 			      ((ptr->app.len > 0) ? ZR060_MER_App : 0));
516 
517 		/* Setup the Video Frontend */
518 		/* Limit pixel range to 16..235 as per CCIR-601 */
519 		zr36060_write(ptr, ZR060_VCR, ZR060_VCR_Range);
520 
521 	} else {
522 		dprintk(2, "%s: EXPANSION SETUP\n", ptr->name);
523 
524 		zr36060_write(ptr, ZR060_LOAD, ZR060_LOAD_SyncRst);
525 
526 		/* 060 communicates with 067 in master mode */
527 		zr36060_write(ptr, ZR060_CIR, ZR060_CIR_CodeMstr);
528 
529 		/* Decompression */
530 		zr36060_write(ptr, ZR060_CMR, 0);
531 
532 		/* Must be zero */
533 		zr36060_write(ptr, ZR060_MBZ, 0x00);
534 		zr36060_write(ptr, ZR060_TCR_HI, 0x00);
535 		zr36060_write(ptr, ZR060_TCR_LO, 0x00);
536 
537 		/* Disable all IRQs - no DataErr means autoreset */
538 		zr36060_write(ptr, ZR060_IMR, 0);
539 
540 		/* setup misc. data for expansion */
541 		zr36060_write(ptr, ZR060_MER, 0);
542 
543 		/* setup the fixed jpeg tables - maybe variable, though -
544 		 * (see table init section above) */
545 		zr36060_pushit(ptr, ZR060_DHT_IDX, sizeof(zr36060_dht),
546 			       zr36060_dht);
547 
548 		/* Setup the Video Frontend */
549 		//zr36060_write(ptr, ZR060_VCR, ZR060_VCR_FIExt);
550 		//this doesn't seem right and doesn't work...
551 		zr36060_write(ptr, ZR060_VCR, ZR060_VCR_Range);
552 	}
553 
554 	/* Load the tables */
555 	zr36060_write(ptr, ZR060_LOAD,
556 		      ZR060_LOAD_SyncRst | ZR060_LOAD_Load);
557 	zr36060_wait_end(ptr);
558 	dprintk(2, "%s: Status after table preload: 0x%02x\n", ptr->name,
559 		ptr->status);
560 
561 	if (ptr->status & ZR060_CFSR_Busy) {
562 		dprintk(1, KERN_ERR "%s: init aborted!\n", ptr->name);
563 		return;		// something is wrong, its timed out!!!!
564 	}
565 }
566 
567 /* =========================================================================
568    CODEC API FUNCTIONS
569 
570    this functions are accessed by the master via the API structure
571    ========================================================================= */
572 
573 /* set compression/expansion mode and launches codec -
574    this should be the last call from the master before starting processing */
575 static int
576 zr36060_set_mode (struct videocodec *codec,
577 		  int                mode)
578 {
579 	struct zr36060 *ptr = (struct zr36060 *) codec->data;
580 
581 	dprintk(2, "%s: set_mode %d call\n", ptr->name, mode);
582 
583 	if ((mode != CODEC_DO_EXPANSION) && (mode != CODEC_DO_COMPRESSION))
584 		return -EINVAL;
585 
586 	ptr->mode = mode;
587 	zr36060_init(ptr);
588 
589 	return 0;
590 }
591 
592 /* set picture size (norm is ignored as the codec doesn't know about it) */
593 static int
594 zr36060_set_video (struct videocodec   *codec,
595 		   struct tvnorm       *norm,
596 		   struct vfe_settings *cap,
597 		   struct vfe_polarity *pol)
598 {
599 	struct zr36060 *ptr = (struct zr36060 *) codec->data;
600 	u32 reg;
601 	int size;
602 
603 	dprintk(2, "%s: set_video %d/%d-%dx%d (%%%d) call\n", ptr->name,
604 		cap->x, cap->y, cap->width, cap->height, cap->decimation);
605 
606 	/* if () return -EINVAL;
607 	 * trust the master driver that it knows what it does - so
608 	 * we allow invalid startx/y and norm for now ... */
609 	ptr->width = cap->width / (cap->decimation & 0xff);
610 	ptr->height = cap->height / (cap->decimation >> 8);
611 
612 	zr36060_write(ptr, ZR060_LOAD, ZR060_LOAD_SyncRst);
613 
614 	/* Note that VSPol/HSPol bits in zr36060 have the opposite
615 	 * meaning of their zr360x7 counterparts with the same names
616 	 * N.b. for VSPol this is only true if FIVEdge = 0 (default,
617 	 * left unchanged here - in accordance with datasheet).
618 	*/
619 	reg = (!pol->vsync_pol ? ZR060_VPR_VSPol : 0)
620 	    | (!pol->hsync_pol ? ZR060_VPR_HSPol : 0)
621 	    | (pol->field_pol ? ZR060_VPR_FIPol : 0)
622 	    | (pol->blank_pol ? ZR060_VPR_BLPol : 0)
623 	    | (pol->subimg_pol ? ZR060_VPR_SImgPol : 0)
624 	    | (pol->poe_pol ? ZR060_VPR_PoePol : 0)
625 	    | (pol->pvalid_pol ? ZR060_VPR_PValPol : 0)
626 	    | (pol->vclk_pol ? ZR060_VPR_VCLKPol : 0);
627 	zr36060_write(ptr, ZR060_VPR, reg);
628 
629 	reg = 0;
630 	switch (cap->decimation & 0xff) {
631 	default:
632 	case 1:
633 		break;
634 
635 	case 2:
636 		reg |= ZR060_SR_HScale2;
637 		break;
638 
639 	case 4:
640 		reg |= ZR060_SR_HScale4;
641 		break;
642 	}
643 
644 	switch (cap->decimation >> 8) {
645 	default:
646 	case 1:
647 		break;
648 
649 	case 2:
650 		reg |= ZR060_SR_VScale;
651 		break;
652 	}
653 	zr36060_write(ptr, ZR060_SR, reg);
654 
655 	zr36060_write(ptr, ZR060_BCR_Y, 0x00);
656 	zr36060_write(ptr, ZR060_BCR_U, 0x80);
657 	zr36060_write(ptr, ZR060_BCR_V, 0x80);
658 
659 	/* sync generator */
660 
661 	reg = norm->Ht - 1;	/* Vtotal */
662 	zr36060_write(ptr, ZR060_SGR_VTOTAL_HI, (reg >> 8) & 0xff);
663 	zr36060_write(ptr, ZR060_SGR_VTOTAL_LO, (reg >> 0) & 0xff);
664 
665 	reg = norm->Wt - 1;	/* Htotal */
666 	zr36060_write(ptr, ZR060_SGR_HTOTAL_HI, (reg >> 8) & 0xff);
667 	zr36060_write(ptr, ZR060_SGR_HTOTAL_LO, (reg >> 0) & 0xff);
668 
669 	reg = 6 - 1;		/* VsyncSize */
670 	zr36060_write(ptr, ZR060_SGR_VSYNC, reg);
671 
672 	//reg   = 30 - 1;               /* HsyncSize */
673 ///*CP*/        reg = (zr->params.norm == 1 ? 57 : 68);
674 	reg = 68;
675 	zr36060_write(ptr, ZR060_SGR_HSYNC, reg);
676 
677 	reg = norm->VStart - 1;	/* BVstart */
678 	zr36060_write(ptr, ZR060_SGR_BVSTART, reg);
679 
680 	reg += norm->Ha / 2;	/* BVend */
681 	zr36060_write(ptr, ZR060_SGR_BVEND_HI, (reg >> 8) & 0xff);
682 	zr36060_write(ptr, ZR060_SGR_BVEND_LO, (reg >> 0) & 0xff);
683 
684 	reg = norm->HStart - 1;	/* BHstart */
685 	zr36060_write(ptr, ZR060_SGR_BHSTART, reg);
686 
687 	reg += norm->Wa;	/* BHend */
688 	zr36060_write(ptr, ZR060_SGR_BHEND_HI, (reg >> 8) & 0xff);
689 	zr36060_write(ptr, ZR060_SGR_BHEND_LO, (reg >> 0) & 0xff);
690 
691 	/* active area */
692 	reg = cap->y + norm->VStart;	/* Vstart */
693 	zr36060_write(ptr, ZR060_AAR_VSTART_HI, (reg >> 8) & 0xff);
694 	zr36060_write(ptr, ZR060_AAR_VSTART_LO, (reg >> 0) & 0xff);
695 
696 	reg += cap->height;	/* Vend */
697 	zr36060_write(ptr, ZR060_AAR_VEND_HI, (reg >> 8) & 0xff);
698 	zr36060_write(ptr, ZR060_AAR_VEND_LO, (reg >> 0) & 0xff);
699 
700 	reg = cap->x + norm->HStart;	/* Hstart */
701 	zr36060_write(ptr, ZR060_AAR_HSTART_HI, (reg >> 8) & 0xff);
702 	zr36060_write(ptr, ZR060_AAR_HSTART_LO, (reg >> 0) & 0xff);
703 
704 	reg += cap->width;	/* Hend */
705 	zr36060_write(ptr, ZR060_AAR_HEND_HI, (reg >> 8) & 0xff);
706 	zr36060_write(ptr, ZR060_AAR_HEND_LO, (reg >> 0) & 0xff);
707 
708 	/* subimage area */
709 	reg = norm->VStart - 4;	/* SVstart */
710 	zr36060_write(ptr, ZR060_SWR_VSTART_HI, (reg >> 8) & 0xff);
711 	zr36060_write(ptr, ZR060_SWR_VSTART_LO, (reg >> 0) & 0xff);
712 
713 	reg += norm->Ha / 2 + 8;	/* SVend */
714 	zr36060_write(ptr, ZR060_SWR_VEND_HI, (reg >> 8) & 0xff);
715 	zr36060_write(ptr, ZR060_SWR_VEND_LO, (reg >> 0) & 0xff);
716 
717 	reg = norm->HStart /*+ 64 */  - 4;	/* SHstart */
718 	zr36060_write(ptr, ZR060_SWR_HSTART_HI, (reg >> 8) & 0xff);
719 	zr36060_write(ptr, ZR060_SWR_HSTART_LO, (reg >> 0) & 0xff);
720 
721 	reg += norm->Wa + 8;	/* SHend */
722 	zr36060_write(ptr, ZR060_SWR_HEND_HI, (reg >> 8) & 0xff);
723 	zr36060_write(ptr, ZR060_SWR_HEND_LO, (reg >> 0) & 0xff);
724 
725 	size = ptr->width * ptr->height;
726 	/* Target compressed field size in bits: */
727 	size = size * 16;	/* uncompressed size in bits */
728 	/* (Ronald) by default, quality = 100 is a compression
729 	 * ratio 1:2. Setting low_bitrate (insmod option) sets
730 	 * it to 1:4 (instead of 1:2, zr36060 max) as limit because the
731 	 * buz can't handle more at decimation=1... Use low_bitrate if
732 	 * you have a Buz, unless you know what you're doing */
733 	size = size * cap->quality / (low_bitrate ? 400 : 200);
734 	/* Lower limit (arbitrary, 1 KB) */
735 	if (size < 8192)
736 		size = 8192;
737 	/* Upper limit: 7/8 of the code buffers */
738 	if (size > ptr->total_code_vol * 7)
739 		size = ptr->total_code_vol * 7;
740 
741 	ptr->real_code_vol = size >> 3;	/* in bytes */
742 
743 	/* the MBCVR is the *maximum* block volume, according to the
744 	 * JPEG ISO specs, this shouldn't be used, since that allows
745 	 * for the best encoding quality. So set it to it's max value */
746 	reg = ptr->max_block_vol;
747 	zr36060_write(ptr, ZR060_MBCVR, reg);
748 
749 	return 0;
750 }
751 
752 /* additional control functions */
753 static int
754 zr36060_control (struct videocodec *codec,
755 		 int                type,
756 		 int                size,
757 		 void              *data)
758 {
759 	struct zr36060 *ptr = (struct zr36060 *) codec->data;
760 	int *ival = (int *) data;
761 
762 	dprintk(2, "%s: control %d call with %d byte\n", ptr->name, type,
763 		size);
764 
765 	switch (type) {
766 	case CODEC_G_STATUS:	/* get last status */
767 		if (size != sizeof(int))
768 			return -EFAULT;
769 		zr36060_read_status(ptr);
770 		*ival = ptr->status;
771 		break;
772 
773 	case CODEC_G_CODEC_MODE:
774 		if (size != sizeof(int))
775 			return -EFAULT;
776 		*ival = CODEC_MODE_BJPG;
777 		break;
778 
779 	case CODEC_S_CODEC_MODE:
780 		if (size != sizeof(int))
781 			return -EFAULT;
782 		if (*ival != CODEC_MODE_BJPG)
783 			return -EINVAL;
784 		/* not needed, do nothing */
785 		return 0;
786 
787 	case CODEC_G_VFE:
788 	case CODEC_S_VFE:
789 		/* not needed, do nothing */
790 		return 0;
791 
792 	case CODEC_S_MMAP:
793 		/* not available, give an error */
794 		return -ENXIO;
795 
796 	case CODEC_G_JPEG_TDS_BYTE:	/* get target volume in byte */
797 		if (size != sizeof(int))
798 			return -EFAULT;
799 		*ival = ptr->total_code_vol;
800 		break;
801 
802 	case CODEC_S_JPEG_TDS_BYTE:	/* get target volume in byte */
803 		if (size != sizeof(int))
804 			return -EFAULT;
805 		ptr->total_code_vol = *ival;
806 		ptr->real_code_vol = (ptr->total_code_vol * 6) >> 3;
807 		break;
808 
809 	case CODEC_G_JPEG_SCALE:	/* get scaling factor */
810 		if (size != sizeof(int))
811 			return -EFAULT;
812 		*ival = zr36060_read_scalefactor(ptr);
813 		break;
814 
815 	case CODEC_S_JPEG_SCALE:	/* set scaling factor */
816 		if (size != sizeof(int))
817 			return -EFAULT;
818 		ptr->scalefact = *ival;
819 		break;
820 
821 	case CODEC_G_JPEG_APP_DATA: {	/* get appn marker data */
822 		struct jpeg_app_marker *app = data;
823 
824 		if (size != sizeof(struct jpeg_app_marker))
825 			return -EFAULT;
826 
827 		*app = ptr->app;
828 		break;
829 	}
830 
831 	case CODEC_S_JPEG_APP_DATA: {	/* set appn marker data */
832 		struct jpeg_app_marker *app = data;
833 
834 		if (size != sizeof(struct jpeg_app_marker))
835 			return -EFAULT;
836 
837 		ptr->app = *app;
838 		break;
839 	}
840 
841 	case CODEC_G_JPEG_COM_DATA: {	/* get comment marker data */
842 		struct jpeg_com_marker *com = data;
843 
844 		if (size != sizeof(struct jpeg_com_marker))
845 			return -EFAULT;
846 
847 		*com = ptr->com;
848 		break;
849 	}
850 
851 	case CODEC_S_JPEG_COM_DATA: {	/* set comment marker data */
852 		struct jpeg_com_marker *com = data;
853 
854 		if (size != sizeof(struct jpeg_com_marker))
855 			return -EFAULT;
856 
857 		ptr->com = *com;
858 		break;
859 	}
860 
861 	default:
862 		return -EINVAL;
863 	}
864 
865 	return size;
866 }
867 
868 /* =========================================================================
869    Exit and unregister function:
870 
871    Deinitializes Zoran's JPEG processor
872    ========================================================================= */
873 
874 static int
875 zr36060_unset (struct videocodec *codec)
876 {
877 	struct zr36060 *ptr = codec->data;
878 
879 	if (ptr) {
880 		/* do wee need some codec deinit here, too ???? */
881 
882 		dprintk(1, "%s: finished codec #%d\n", ptr->name,
883 			ptr->num);
884 		kfree(ptr);
885 		codec->data = NULL;
886 
887 		zr36060_codecs--;
888 		return 0;
889 	}
890 
891 	return -EFAULT;
892 }
893 
894 /* =========================================================================
895    Setup and registry function:
896 
897    Initializes Zoran's JPEG processor
898 
899    Also sets pixel size, average code size, mode (compr./decompr.)
900    (the given size is determined by the processor with the video interface)
901    ========================================================================= */
902 
903 static int
904 zr36060_setup (struct videocodec *codec)
905 {
906 	struct zr36060 *ptr;
907 	int res;
908 
909 	dprintk(2, "zr36060: initializing MJPEG subsystem #%d.\n",
910 		zr36060_codecs);
911 
912 	if (zr36060_codecs == MAX_CODECS) {
913 		dprintk(1,
914 			KERN_ERR "zr36060: Can't attach more codecs!\n");
915 		return -ENOSPC;
916 	}
917 	//mem structure init
918 	codec->data = ptr = kzalloc(sizeof(struct zr36060), GFP_KERNEL);
919 	if (NULL == ptr) {
920 		dprintk(1, KERN_ERR "zr36060: Can't get enough memory!\n");
921 		return -ENOMEM;
922 	}
923 
924 	snprintf(ptr->name, sizeof(ptr->name), "zr36060[%d]",
925 		 zr36060_codecs);
926 	ptr->num = zr36060_codecs++;
927 	ptr->codec = codec;
928 
929 	//testing
930 	res = zr36060_basic_test(ptr);
931 	if (res < 0) {
932 		zr36060_unset(codec);
933 		return res;
934 	}
935 	//final setup
936 	memcpy(ptr->h_samp_ratio, zr36060_decimation_h, 8);
937 	memcpy(ptr->v_samp_ratio, zr36060_decimation_v, 8);
938 
939 	ptr->bitrate_ctrl = 0;	/* 0 or 1 - fixed file size flag
940 				 * (what is the difference?) */
941 	ptr->mode = CODEC_DO_COMPRESSION;
942 	ptr->width = 384;
943 	ptr->height = 288;
944 	ptr->total_code_vol = 16000;	/* CHECKME */
945 	ptr->real_code_vol = (ptr->total_code_vol * 6) >> 3;
946 	ptr->max_block_vol = 240;	/* CHECKME, was 120 is 240 */
947 	ptr->scalefact = 0x100;
948 	ptr->dri = 1;		/* CHECKME, was 8 is 1 */
949 
950 	/* by default, no COM or APP markers - app should set those */
951 	ptr->com.len = 0;
952 	ptr->app.appn = 0;
953 	ptr->app.len = 0;
954 
955 	zr36060_init(ptr);
956 
957 	dprintk(1, KERN_INFO "%s: codec attached and running\n",
958 		ptr->name);
959 
960 	return 0;
961 }
962 
963 static const struct videocodec zr36060_codec = {
964 	.owner = THIS_MODULE,
965 	.name = "zr36060",
966 	.magic = 0L,		// magic not used
967 	.flags =
968 	    CODEC_FLAG_JPEG | CODEC_FLAG_HARDWARE | CODEC_FLAG_ENCODER |
969 	    CODEC_FLAG_DECODER | CODEC_FLAG_VFE,
970 	.type = CODEC_TYPE_ZR36060,
971 	.setup = zr36060_setup,	// functionality
972 	.unset = zr36060_unset,
973 	.set_mode = zr36060_set_mode,
974 	.set_video = zr36060_set_video,
975 	.control = zr36060_control,
976 	// others are not used
977 };
978 
979 /* =========================================================================
980    HOOK IN DRIVER AS KERNEL MODULE
981    ========================================================================= */
982 
983 static int __init
984 zr36060_init_module (void)
985 {
986 	//dprintk(1, "zr36060 driver %s\n",ZR060_VERSION);
987 	zr36060_codecs = 0;
988 	return videocodec_register(&zr36060_codec);
989 }
990 
991 static void __exit
992 zr36060_cleanup_module (void)
993 {
994 	if (zr36060_codecs) {
995 		dprintk(1,
996 			"zr36060: something's wrong - %d codecs left somehow.\n",
997 			zr36060_codecs);
998 	}
999 
1000 	/* however, we can't just stay alive */
1001 	videocodec_unregister(&zr36060_codec);
1002 }
1003 
1004 module_init(zr36060_init_module);
1005 module_exit(zr36060_cleanup_module);
1006 
1007 MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@skynet.be>");
1008 MODULE_DESCRIPTION("Driver module for ZR36060 jpeg processors "
1009 		   ZR060_VERSION);
1010 MODULE_LICENSE("GPL");
1011