Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
zr36060.c
Go to the documentation of this file.
1 /*
2  * Zoran ZR36060 basic configuration functions
3  *
4  * Copyright (C) 2002 Laurent Pinchart <[email protected]>
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,
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,
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,
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 */
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 =
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 <[email protected]>");
1008 MODULE_DESCRIPTION("Driver module for ZR36060 jpeg processors "
1009  ZR060_VERSION);
1010 MODULE_LICENSE("GPL");