1/*
2 * zoran - Iomega Buz driver
3 *
4 * Copyright (C) 1999 Rainer Johanni <Rainer@Johanni.de>
5 *
6 * based on
7 *
8 * zoran.0.0.3 Copyright (C) 1998 Dave Perks <dperks@ibm.net>
9 *
10 * and
11 *
12 * bttv - Bt848 frame grabber driver
13 * Copyright (C) 1996,97,98 Ralph  Metzler (rjkm@thp.uni-koeln.de)
14 *                        & Marcus Metzler (mocm@thp.uni-koeln.de)
15 *
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 2 of the License, or
19 * (at your option) any later version.
20 *
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24 * GNU General Public License for more details.
25 *
26 * You should have received a copy of the GNU General Public License
27 * along with this program; if not, write to the Free Software
28 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 */
30
31#ifndef _BUZ_H_
32#define _BUZ_H_
33
34struct zoran_requestbuffers {
35	unsigned long count;	/* Number of buffers for MJPEG grabbing */
36	unsigned long size;	/* Size PER BUFFER in bytes */
37};
38
39struct zoran_sync {
40	unsigned long frame;	/* number of buffer that has been free'd */
41	unsigned long length;	/* number of code bytes in buffer (capture only) */
42	unsigned long seq;	/* frame sequence number */
43	struct timeval timestamp;	/* timestamp */
44};
45
46struct zoran_status {
47	int input;		/* Input channel, has to be set prior to BUZIOC_G_STATUS */
48	int signal;		/* Returned: 1 if valid video signal detected */
49	int norm;		/* Returned: VIDEO_MODE_PAL or VIDEO_MODE_NTSC */
50	int color;		/* Returned: 1 if color signal detected */
51};
52
53struct zoran_params {
54
55	/* The following parameters can only be queried */
56
57	int major_version;	/* Major version number of driver */
58	int minor_version;	/* Minor version number of driver */
59
60	/* Main control parameters */
61
62	int input;		/* Input channel: 0 = Composite, 1 = S-VHS */
63	int norm;		/* Norm: VIDEO_MODE_PAL or VIDEO_MODE_NTSC */
64	int decimation;		/* decimation of captured video,
65				 * enlargement of video played back.
66				 * Valid values are 1, 2, 4 or 0.
67				 * 0 is a special value where the user
68				 * has full control over video scaling */
69
70	/* The following parameters only have to be set if decimation==0,
71	 * for other values of decimation they provide the data how the image is captured */
72
73	int HorDcm;		/* Horizontal decimation: 1, 2 or 4 */
74	int VerDcm;		/* Vertical decimation: 1 or 2 */
75	int TmpDcm;		/* Temporal decimation: 1 or 2,
76				 * if TmpDcm==2 in capture every second frame is dropped,
77				 * in playback every frame is played twice */
78	int field_per_buff;	/* Number of fields per buffer: 1 or 2 */
79	int img_x;		/* start of image in x direction */
80	int img_y;		/* start of image in y direction */
81	int img_width;		/* image width BEFORE decimation,
82				 * must be a multiple of HorDcm*16 */
83	int img_height;		/* image height BEFORE decimation,
84				 * must be a multiple of VerDcm*8 */
85
86	/* --- End of parameters for decimation==0 only --- */
87
88	/* JPEG control parameters */
89
90	int quality;		/* Measure for quality of compressed images.
91				 * Scales linearly with the size of the compressed images.
92				 * Must be beetween 0 and 100, 100 is a compression
93				 * ratio of 1:4 */
94
95	int odd_even;		/* Which field should come first ??? */
96
97	int APPn;		/* Number of APP segment to be written, must be 0..15 */
98	int APP_len;		/* Length of data in JPEG APPn segment */
99	char APP_data[60];	/* Data in the JPEG APPn segment. */
100
101	int COM_len;		/* Length of data in JPEG COM segment */
102	char COM_data[60];	/* Data in JPEG COM segment */
103
104	unsigned long jpeg_markers;	/* Which markers should go into the JPEG output.
105					 * Unless you exactly know what you do, leave them untouched.
106					 * Inluding less markers will make the resulting code
107					 * smaller, but there will be fewer aplications
108					 * which can read it.
109					 * The presence of the APP and COM marker is
110					 * influenced by APP0_len and COM_len ONLY! */
111#define JPEG_MARKER_DHT (1<<3)	/* Define Huffman Tables */
112#define JPEG_MARKER_DQT (1<<4)	/* Define Quantization Tables */
113#define JPEG_MARKER_DRI (1<<5)	/* Define Restart Interval */
114#define JPEG_MARKER_COM (1<<6)	/* Comment segment */
115#define JPEG_MARKER_APP (1<<7)	/* App segment, driver will allways use APP0 */
116
117	int VFIFO_FB;		/* Flag for enabling Video Fifo Feedback.
118				 * If this flag is turned on and JPEG decompressing
119				 * is going to the screen, the decompress process
120				 * is stopped every time the Video Fifo is full.
121				 * This enables a smooth decompress to the screen
122				 * but the video output signal will get scrambled */
123
124	/* Misc */
125
126	char reserved[312];	/* Makes 512 bytes for this structure */
127};
128
129/*
130Private IOCTL to set up for displaying MJPEG
131*/
132#define BUZIOC_G_PARAMS       _IOR ('v', BASE_VIDIOCPRIVATE+0,  struct zoran_params)
133#define BUZIOC_S_PARAMS       _IOWR('v', BASE_VIDIOCPRIVATE+1,  struct zoran_params)
134#define BUZIOC_REQBUFS        _IOWR('v', BASE_VIDIOCPRIVATE+2,  struct zoran_requestbuffers)
135#define BUZIOC_QBUF_CAPT      _IOW ('v', BASE_VIDIOCPRIVATE+3,  int)
136#define BUZIOC_QBUF_PLAY      _IOW ('v', BASE_VIDIOCPRIVATE+4,  int)
137#define BUZIOC_SYNC           _IOR ('v', BASE_VIDIOCPRIVATE+5,  struct zoran_sync)
138#define BUZIOC_G_STATUS       _IOWR('v', BASE_VIDIOCPRIVATE+6,  struct zoran_status)
139
140
141#ifdef __KERNEL__
142
143#define MAJOR_VERSION 0		/* driver major version */
144#define MINOR_VERSION 9		/* driver minor version */
145#define RELEASE_VERSION 5	/* release version */
146
147#define ZORAN_NAME    "ZORAN"	/* name of the device */
148
149#define ZR_DEVNAME(zr) ((zr)->name)
150
151#define   BUZ_MAX_WIDTH   (zr->timing->Wa)
152#define   BUZ_MAX_HEIGHT  (zr->timing->Ha)
153#define   BUZ_MIN_WIDTH    32	/* never display less than 32 pixels */
154#define   BUZ_MIN_HEIGHT   24	/* never display less than 24 rows */
155
156#define BUZ_NUM_STAT_COM    4
157#define BUZ_MASK_STAT_COM   3
158
159#define BUZ_MAX_FRAME     256	/* Must be a power of 2 */
160#define BUZ_MASK_FRAME    255	/* Must be BUZ_MAX_FRAME-1 */
161
162#define BUZ_MAX_INPUT       16
163
164#if VIDEO_MAX_FRAME <= 32
165#   define   V4L_MAX_FRAME   32
166#elif VIDEO_MAX_FRAME <= 64
167#   define   V4L_MAX_FRAME   64
168#else
169#   error   "Too many video frame buffers to handle"
170#endif
171#define   V4L_MASK_FRAME   (V4L_MAX_FRAME - 1)
172
173#define MAX_KMALLOC_MEM (128*1024)
174
175#include "zr36057.h"
176
177enum card_type {
178	UNKNOWN = -1,
179
180	/* Pinnacle/Miro */
181	DC10_old,		/* DC30 like */
182	DC10_new,		/* DC10plus like */
183	DC10plus,
184	DC30,
185	DC30plus,
186
187	/* Linux Media Labs */
188	LML33,
189	LML33R10,
190
191	/* Iomega */
192	BUZ,
193
194	/* AverMedia */
195	AVS6EYES,
196
197	/* total number of cards */
198	NUM_CARDS
199};
200
201enum zoran_codec_mode {
202	BUZ_MODE_IDLE,		/* nothing going on */
203	BUZ_MODE_MOTION_COMPRESS,	/* grabbing frames */
204	BUZ_MODE_MOTION_DECOMPRESS,	/* playing frames */
205	BUZ_MODE_STILL_COMPRESS,	/* still frame conversion */
206	BUZ_MODE_STILL_DECOMPRESS	/* still frame conversion */
207};
208
209enum zoran_buffer_state {
210	BUZ_STATE_USER,		/* buffer is owned by application */
211	BUZ_STATE_PEND,		/* buffer is queued in pend[] ready to feed to I/O */
212	BUZ_STATE_DMA,		/* buffer is queued in dma[] for I/O */
213	BUZ_STATE_DONE		/* buffer is ready to return to application */
214};
215
216enum zoran_map_mode {
217	ZORAN_MAP_MODE_RAW,
218	ZORAN_MAP_MODE_JPG_REC,
219#define ZORAN_MAP_MODE_JPG ZORAN_MAP_MODE_JPG_REC
220	ZORAN_MAP_MODE_JPG_PLAY,
221};
222
223enum gpio_type {
224	GPIO_JPEG_SLEEP = 0,
225	GPIO_JPEG_RESET,
226	GPIO_JPEG_FRAME,
227	GPIO_VID_DIR,
228	GPIO_VID_EN,
229	GPIO_VID_RESET,
230	GPIO_CLK_SEL1,
231	GPIO_CLK_SEL2,
232	GPIO_MAX,
233};
234
235enum gpcs_type {
236	GPCS_JPEG_RESET = 0,
237	GPCS_JPEG_START,
238	GPCS_MAX,
239};
240
241struct zoran_format {
242	char *name;
243	int palette;
244	__u32 fourcc;
245	int colorspace;
246	int depth;
247	__u32 flags;
248};
249/* flags */
250#define ZORAN_FORMAT_COMPRESSED 1<<0
251#define ZORAN_FORMAT_OVERLAY    1<<1
252#define ZORAN_FORMAT_CAPTURE	1<<2
253#define ZORAN_FORMAT_PLAYBACK	1<<3
254
255/* overlay-settings */
256struct zoran_overlay_settings {
257	int is_set;
258	int x, y, width, height;	/* position */
259	int clipcount;		/* position and number of clips */
260	const struct zoran_format *format;	/* overlay format */
261};
262
263/* v4l-capture settings */
264struct zoran_v4l_settings {
265	int width, height, bytesperline;	/* capture size */
266	const struct zoran_format *format;	/* capture format */
267};
268
269/* whoops, this one is undeclared if !v4l2 */
270#ifndef CONFIG_VIDEO_V4L2
271struct v4l2_jpegcompression {
272	int quality;
273	int APPn;
274	int APP_len;
275	char APP_data[60];
276	int COM_len;
277	char COM_data[60];
278	__u32 jpeg_markers;
279	__u8 reserved[116];
280};
281#endif
282
283/* jpg-capture/-playback settings */
284struct zoran_jpg_settings {
285	int decimation;		/* this bit is used to set everything to default */
286	int HorDcm, VerDcm, TmpDcm;	/* capture decimation settings (TmpDcm=1 means both fields) */
287	int field_per_buff, odd_even;	/* field-settings (odd_even=1 (+TmpDcm=1) means top-field-first) */
288	int img_x, img_y, img_width, img_height;	/* crop settings (subframe capture) */
289	struct v4l2_jpegcompression jpg_comp;	/* JPEG-specific capture settings */
290};
291
292struct zoran_mapping {
293	struct file *file;
294	int count;
295};
296
297struct zoran_jpg_buffer {
298	struct zoran_mapping *map;
299	u32 *frag_tab;		/* addresses of frag table */
300	u32 frag_tab_bus;	/* same value cached to save time in ISR */
301	enum zoran_buffer_state state;	/* non-zero if corresponding buffer is in use in grab queue */
302	struct zoran_sync bs;	/* DONE: info to return to application */
303};
304
305struct zoran_v4l_buffer {
306	struct zoran_mapping *map;
307	char *fbuffer;		/* virtual  address of frame buffer */
308	unsigned long fbuffer_phys;	/* physical address of frame buffer */
309	unsigned long fbuffer_bus;	/* bus      address of frame buffer */
310	enum zoran_buffer_state state;	/* state: unused/pending/done */
311	struct zoran_sync bs;	/* DONE: info to return to application */
312};
313
314enum zoran_lock_activity {
315	ZORAN_FREE,		/* free for use */
316	ZORAN_ACTIVE,		/* active but unlocked */
317	ZORAN_LOCKED,		/* locked */
318};
319
320/* buffer collections */
321struct zoran_jpg_struct {
322	enum zoran_lock_activity active;	/* feature currently in use? */
323	struct zoran_jpg_buffer buffer[BUZ_MAX_FRAME];	/* buffers */
324	int num_buffers, buffer_size;
325	u8 allocated;		/* Flag if buffers are allocated  */
326	u8 ready_to_be_freed;	/* hack - see zoran_driver.c */
327	u8 need_contiguous;	/* Flag if contiguous buffers are needed */
328};
329
330struct zoran_v4l_struct {
331	enum zoran_lock_activity active;	/* feature currently in use? */
332	struct zoran_v4l_buffer buffer[VIDEO_MAX_FRAME];	/* buffers */
333	int num_buffers, buffer_size;
334	u8 allocated;		/* Flag if buffers are allocated  */
335	u8 ready_to_be_freed;	/* hack - see zoran_driver.c */
336};
337
338struct zoran;
339
340/* zoran_fh contains per-open() settings */
341struct zoran_fh {
342	struct zoran *zr;
343
344	enum zoran_map_mode map_mode;	/* Flag which bufferset will map by next mmap() */
345
346	struct zoran_overlay_settings overlay_settings;
347	u32 *overlay_mask;	/* overlay mask */
348	enum zoran_lock_activity overlay_active;	/* feature currently in use? */
349
350	struct zoran_v4l_settings v4l_settings;	/* structure with a lot of things to play with */
351	struct zoran_v4l_struct v4l_buffers;	/* V4L buffers' info */
352
353	struct zoran_jpg_settings jpg_settings;	/* structure with a lot of things to play with */
354	struct zoran_jpg_struct jpg_buffers;	/* MJPEG buffers' info */
355};
356
357struct card_info {
358	enum card_type type;
359	char name[32];
360	u16 i2c_decoder, i2c_encoder;			/* I2C types */
361	u16 video_vfe, video_codec;			/* videocodec types */
362	u16 audio_chip;					/* audio type */
363	u16 vendor_id, device_id;	/* subsystem vendor/device ID */
364
365	int inputs;		/* number of video inputs */
366	struct input {
367		int muxsel;
368		char name[32];
369	} input[BUZ_MAX_INPUT];
370
371	int norms;
372	struct tvnorm *tvn[3];	/* supported TV norms */
373
374	u32 jpeg_int;		/* JPEG interrupt */
375	u32 vsync_int;		/* VSYNC interrupt */
376	s8 gpio[GPIO_MAX];
377	u8 gpcs[GPCS_MAX];
378
379	struct vfe_polarity vfe_pol;
380	u8 gpio_pol[GPIO_MAX];
381
382	/* is the /GWS line conected? */
383	u8 gws_not_connected;
384
385	/* avs6eyes mux setting */
386	u8 input_mux;
387
388	void (*init) (struct zoran * zr);
389};
390
391struct zoran {
392	struct video_device *video_dev;
393
394	struct i2c_adapter i2c_adapter;	/* */
395	struct i2c_algo_bit_data i2c_algo;	/* */
396	u32 i2cbr;
397
398	struct i2c_client *decoder;	/* video decoder i2c client */
399	struct i2c_client *encoder;	/* video encoder i2c client */
400
401	struct videocodec *codec;	/* video codec */
402	struct videocodec *vfe;	/* video front end */
403
404	struct mutex resource_lock;	/* prevent evil stuff */
405
406	u8 initialized;		/* flag if zoran has been correctly initalized */
407	int user;		/* number of current users */
408	struct card_info card;
409	struct tvnorm *timing;
410
411	unsigned short id;	/* number of this device */
412	char name[32];		/* name of this device */
413	struct pci_dev *pci_dev;	/* PCI device */
414	unsigned char revision;	/* revision of zr36057 */
415	unsigned int zr36057_adr;	/* bus address of IO mem returned by PCI BIOS */
416	unsigned char __iomem *zr36057_mem;/* pointer to mapped IO memory */
417
418	spinlock_t spinlock;	/* Spinlock */
419
420	/* Video for Linux parameters */
421	int input, norm;	/* card's norm and input - norm=VIDEO_MODE_* */
422	int hue, saturation, contrast, brightness;	/* Current picture params */
423	struct video_buffer buffer;	/* Current buffer params */
424	struct zoran_overlay_settings overlay_settings;
425	u32 *overlay_mask;	/* overlay mask */
426	enum zoran_lock_activity overlay_active;	/* feature currently in use? */
427
428	wait_queue_head_t v4l_capq;
429
430	int v4l_overlay_active;	/* Overlay grab is activated */
431	int v4l_memgrab_active;	/* Memory grab is activated */
432
433	int v4l_grab_frame;	/* Frame number being currently grabbed */
434#define NO_GRAB_ACTIVE (-1)
435	unsigned long v4l_grab_seq;	/* Number of frames grabbed */
436	struct zoran_v4l_settings v4l_settings;	/* structure with a lot of things to play with */
437
438	/* V4L grab queue of frames pending */
439	unsigned long v4l_pend_head;
440	unsigned long v4l_pend_tail;
441	unsigned long v4l_sync_tail;
442	int v4l_pend[V4L_MAX_FRAME];
443	struct zoran_v4l_struct v4l_buffers;	/* V4L buffers' info */
444
445	/* Buz MJPEG parameters */
446	enum zoran_codec_mode codec_mode;	/* status of codec */
447	struct zoran_jpg_settings jpg_settings;	/* structure with a lot of things to play with */
448
449	wait_queue_head_t jpg_capq;	/* wait here for grab to finish */
450
451	/* grab queue counts/indices, mask with BUZ_MASK_STAT_COM before using as index */
452	/* (dma_head - dma_tail) is number active in DMA, must be <= BUZ_NUM_STAT_COM */
453	/* (value & BUZ_MASK_STAT_COM) corresponds to index in stat_com table */
454	unsigned long jpg_que_head;	/* Index where to put next buffer which is queued */
455	unsigned long jpg_dma_head;	/* Index of next buffer which goes into stat_com  */
456	unsigned long jpg_dma_tail;	/* Index of last buffer in stat_com               */
457	unsigned long jpg_que_tail;	/* Index of last buffer in queue                  */
458	unsigned long jpg_seq_num;	/* count of frames since grab/play started        */
459	unsigned long jpg_err_seq;	/* last seq_num before error                      */
460	unsigned long jpg_err_shift;
461	unsigned long jpg_queued_num;	/* count of frames queued since grab/play started */
462
463	/* zr36057's code buffer table */
464	u32 *stat_com;		/* stat_com[i] is indexed by dma_head/tail & BUZ_MASK_STAT_COM */
465
466	/* (value & BUZ_MASK_FRAME) corresponds to index in pend[] queue */
467	int jpg_pend[BUZ_MAX_FRAME];
468
469	/* array indexed by frame number */
470	struct zoran_jpg_struct jpg_buffers;	/* MJPEG buffers' info */
471
472	/* Additional stuff for testing */
473#ifdef CONFIG_PROC_FS
474	struct proc_dir_entry *zoran_proc;
475#else
476	void *zoran_proc;
477#endif
478	int testing;
479	int jpeg_error;
480	int intr_counter_GIRQ1;
481	int intr_counter_GIRQ0;
482	int intr_counter_CodRepIRQ;
483	int intr_counter_JPEGRepIRQ;
484	int field_counter;
485	int IRQ1_in;
486	int IRQ1_out;
487	int JPEG_in;
488	int JPEG_out;
489	int JPEG_0;
490	int JPEG_1;
491	int END_event_missed;
492	int JPEG_missed;
493	int JPEG_error;
494	int num_errors;
495	int JPEG_max_missed;
496	int JPEG_min_missed;
497
498	u32 last_isr;
499	unsigned long frame_num;
500
501	wait_queue_head_t test_q;
502};
503
504/*The following should be done in more portable way. It depends on define
505  of _ALPHA_BUZ in the Makefile.*/
506
507#ifdef _ALPHA_BUZ
508#define btwrite(dat,adr)    writel((dat), zr->zr36057_adr+(adr))
509#define btread(adr)         readl(zr->zr36057_adr+(adr))
510#else
511#define btwrite(dat,adr)    writel((dat), zr->zr36057_mem+(adr))
512#define btread(adr)         readl(zr->zr36057_mem+(adr))
513#endif
514
515#define btand(dat,adr)      btwrite((dat) & btread(adr), adr)
516#define btor(dat,adr)       btwrite((dat) | btread(adr), adr)
517#define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
518
519#endif				/* __kernel__ */
520
521#endif
522