ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / media / video / bttvp.h
1 /*
2     bttv - Bt848 frame grabber driver
3
4     bttv's *private* header file  --  nobody other than bttv itself
5     should ever include this file.
6
7     (c) 2000-2002 Gerd Knorr <kraxel@bytesex.org>
8
9     This program is free software; you can redistribute it and/or modify
10     it under the terms of the GNU General Public License as published by
11     the Free Software Foundation; either version 2 of the License, or
12     (at your option) any later version.
13
14     This program is distributed in the hope that it will be useful,
15     but WITHOUT ANY WARRANTY; without even the implied warranty of
16     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17     GNU General Public License for more details.
18
19     You should have received a copy of the GNU General Public License
20     along with this program; if not, write to the Free Software
21     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24 #ifndef _BTTVP_H_
25 #define _BTTVP_H_
26
27 #include <linux/version.h>
28 #define BTTV_VERSION_CODE KERNEL_VERSION(0,9,14)
29
30 #include <linux/types.h>
31 #include <linux/wait.h>
32 #include <linux/i2c.h>
33 #include <linux/i2c-algo-bit.h>
34 #include <linux/videodev.h>
35 #include <linux/pci.h>
36 #include <linux/input.h>
37 #include <asm/scatterlist.h>
38 #include <asm/io.h>
39
40 #include <linux/device.h>
41 #include <media/video-buf.h>
42 #include <media/audiochip.h>
43 #include <media/tuner.h>
44 #include <media/ir-common.h>
45
46 #include "bt848.h"
47 #include "bttv.h"
48 #include "btcx-risc.h"
49
50 #ifdef __KERNEL__
51
52 #define FORMAT_FLAGS_DITHER       0x01
53 #define FORMAT_FLAGS_PACKED       0x02
54 #define FORMAT_FLAGS_PLANAR       0x04
55 #define FORMAT_FLAGS_RAW          0x08
56 #define FORMAT_FLAGS_CrCb         0x10
57
58 #define RISC_SLOT_O_VBI        4
59 #define RISC_SLOT_O_FIELD      6
60 #define RISC_SLOT_E_VBI       10
61 #define RISC_SLOT_E_FIELD     12
62 #define RISC_SLOT_LOOP        14
63
64 #define RESOURCE_OVERLAY       1
65 #define RESOURCE_VIDEO         2
66 #define RESOURCE_VBI           4
67
68 #define RAW_LINES            640
69 #define RAW_BPL             1024
70
71 #define UNSET (-1U)
72
73 /* ---------------------------------------------------------- */
74
75 struct bttv_tvnorm {
76         int   v4l2_id;
77         char  *name;
78         u32   Fsc;
79         u16   swidth, sheight; /* scaled standard width, height */
80         u16   totalwidth;
81         u8    adelay, bdelay, iform;
82         u32   scaledtwidth;
83         u16   hdelayx1, hactivex1;
84         u16   vdelay;
85         u8    vbipack;
86         u16   vtotal;
87         int   sram;
88 };
89 extern const struct bttv_tvnorm bttv_tvnorms[];
90 extern const unsigned int BTTV_TVNORMS;
91
92 struct bttv_format {
93         char *name;
94         int  palette;         /* video4linux 1      */
95         int  fourcc;          /* video4linux 2      */
96         int  btformat;        /* BT848_COLOR_FMT_*  */
97         int  btswap;          /* BT848_COLOR_CTL_*  */
98         int  depth;           /* bit/pixel          */
99         int  flags;
100         int  hshift,vshift;   /* for planar modes   */
101 };
102 extern const struct bttv_format bttv_formats[];
103 extern const unsigned int BTTV_FORMATS;
104
105 /* ---------------------------------------------------------- */
106
107 struct bttv_geometry {
108         u8  vtc,crop,comb;
109         u16 width,hscale,hdelay;
110         u16 sheight,vscale,vdelay,vtotal;
111 };
112
113 struct bttv_buffer {
114         /* common v4l buffer stuff -- must be first */
115         struct videobuf_buffer     vb;
116
117         /* bttv specific */
118         const struct bttv_format   *fmt;
119         int                        tvnorm;
120         int                        btformat;
121         int                        btswap;
122         struct bttv_geometry       geo;
123         struct btcx_riscmem        top;
124         struct btcx_riscmem        bottom;
125 };
126
127 struct bttv_buffer_set {
128         struct bttv_buffer     *top;       /* top field buffer    */
129         struct bttv_buffer     *bottom;    /* bottom field buffer */
130         struct bttv_buffer     *vbi;       /* vbi buffer */
131         unsigned int           irqflags;
132         unsigned int           topirq;
133 };
134
135 struct bttv_overlay {
136         int                    tvnorm;
137         struct v4l2_rect       w;
138         enum v4l2_field        field;
139         struct v4l2_clip       *clips;
140         int                    nclips;
141         int                    setup_ok;
142 };
143
144 struct bttv_fh {
145         struct bttv              *btv;
146         int resources;
147 #ifdef VIDIOC_G_PRIORITY 
148         enum v4l2_priority       prio;
149 #endif
150         enum v4l2_buf_type       type;
151
152         /* video capture */
153         struct videobuf_queue    cap;
154         const struct bttv_format *fmt;
155         int                      width;
156         int                      height;
157
158         /* current settings */
159         const struct bttv_format *ovfmt;
160         struct bttv_overlay      ov;
161
162         /* video overlay */
163         struct videobuf_queue    vbi;
164         int                      lines;
165 };
166
167 /* ---------------------------------------------------------- */
168 /* bttv-risc.c                                                */
169
170 /* risc code generators - capture */
171 int bttv_risc_packed(struct bttv *btv, struct btcx_riscmem *risc,
172                      struct scatterlist *sglist,
173                      unsigned int offset, unsigned int bpl,
174                      unsigned int pitch, unsigned int lines);
175 int bttv_risc_planar(struct bttv *btv, struct btcx_riscmem *risc,
176                      struct scatterlist *sglist,
177                      unsigned int yoffset,  unsigned int ybpl,
178                      unsigned int ypadding, unsigned int ylines,
179                      unsigned int uoffset,  unsigned int voffset,
180                      unsigned int hshift,   unsigned int vshift,
181                      unsigned int cpadding);
182 int bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc,
183                       const struct bttv_format *fmt,
184                       struct bttv_overlay *ov,
185                       int skip_top, int skip_bottom);
186
187 /* calculate / apply geometry settings */
188 void bttv_calc_geo(struct bttv *btv, struct bttv_geometry *geo,
189                    int width, int height, int interleaved, int norm);
190 void bttv_apply_geo(struct bttv *btv, struct bttv_geometry *geo, int top);
191
192 /* control dma register + risc main loop */
193 void bttv_set_dma(struct bttv *btv, int override, int irqflags);
194 int bttv_risc_init_main(struct bttv *btv);
195 int bttv_risc_hook(struct bttv *btv, int slot, struct btcx_riscmem *risc,
196                    int irqflags);
197
198 /* capture buffer handling */
199 int bttv_buffer_risc(struct bttv *btv, struct bttv_buffer *buf);
200 int bttv_buffer_set_activate(struct bttv *btv,
201                              struct bttv_buffer_set *set);
202 void bttv_dma_free(struct bttv *btv, struct bttv_buffer *buf);
203
204 /* overlay handling */
205 int bttv_overlay_risc(struct bttv *btv, struct bttv_overlay *ov,
206                       const struct bttv_format *fmt,
207                       struct bttv_buffer *buf);
208
209
210 /* ---------------------------------------------------------- */
211 /* bttv-vbi.c                                                 */
212
213 void bttv_vbi_try_fmt(struct bttv_fh *fh, struct v4l2_format *f);
214 void bttv_vbi_get_fmt(struct bttv_fh *fh, struct v4l2_format *f);
215 void bttv_vbi_setlines(struct bttv_fh *fh, struct bttv *btv, int lines);
216
217 extern struct videobuf_queue_ops bttv_vbi_qops;
218
219 /* ---------------------------------------------------------- */
220 /* bttv-gpio.c */
221
222
223 extern struct bus_type bttv_sub_bus_type;
224 int bttv_sub_add_device(struct bttv_core *core, char *name);
225 int bttv_sub_del_devices(struct bttv_core *core);
226 void bttv_gpio_irq(struct bttv_core *core);
227
228
229 /* ---------------------------------------------------------- */
230 /* bttv-driver.c                                              */
231
232 /* insmod options */
233 extern unsigned int bttv_verbose;
234 extern unsigned int bttv_debug;
235 extern unsigned int bttv_gpio;
236 extern void bttv_gpio_tracking(struct bttv *btv, char *comment);
237 extern int init_bttv_i2c(struct bttv *btv);
238 extern int fini_bttv_i2c(struct bttv *btv);
239 extern int pvr_boot(struct bttv *btv);
240
241 extern int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg);
242 extern void bttv_reinit_bt848(struct bttv *btv);
243 extern void bttv_field_count(struct bttv *btv);
244
245 #define vprintk  if (bttv_verbose) printk
246 #define dprintk  if (bttv_debug >= 1) printk
247 #define d2printk if (bttv_debug >= 2) printk
248
249 /* our devices */
250 #define BTTV_MAX 16
251 extern unsigned int bttv_num;
252 extern struct bttv bttvs[BTTV_MAX];
253
254 #define BTTV_MAX_FBUF   0x208000
255 #define VBIBUF_SIZE     (2048*VBI_MAXLINES*2)
256 #define BTTV_TIMEOUT    (HZ/2) /* 0.5 seconds */
257 #define BTTV_FREE_IDLE  (HZ)   /* one second */
258
259
260 struct bttv_pll_info {
261         unsigned int pll_ifreq;    /* PLL input frequency        */
262         unsigned int pll_ofreq;    /* PLL output frequency       */
263         unsigned int pll_crystal;  /* Crystal used for input     */
264         unsigned int pll_current;  /* Currently programmed ofreq */
265 };
266
267 /* for gpio-connected remote control */
268 struct bttv_input {
269         struct input_dev      dev;
270         struct ir_input_state ir;
271         char                  name[32];
272         char                  phys[32];
273         u32                   mask_keycode;
274         u32                   mask_keydown;
275 };
276
277 struct bttv_suspend_state {
278         u32  pci_cfg[64 / sizeof(u32)];
279         u32  gpio_enable;
280         u32  gpio_data;
281         int  disabled;
282         struct bttv_buffer_set set;
283 };
284
285 struct bttv {
286         struct bttv_core c;
287
288         /* pci device config */
289         unsigned short id;
290         unsigned char revision;
291         unsigned char *bt848_mmio;   /* pointer to mmio */
292
293         /* card configuration info */
294         unsigned int cardid;   /* pci subsystem id (bt878 based ones) */
295         unsigned int tuner_type;  /* tuner chip type */
296         unsigned int pinnacle_id;
297         unsigned int svhs;
298         struct bttv_pll_info pll;
299         int triton1;
300         int gpioirq;
301         int use_i2c_hw;
302
303         /* old gpio interface */
304         wait_queue_head_t gpioq;
305         int shutdown;
306         void (*audio_hook)(struct bttv *btv, struct video_audio *v, int set);
307
308         /* new gpio interface */
309         spinlock_t gpio_lock;
310
311         /* i2c layer */
312         struct i2c_algo_bit_data   i2c_algo;
313         struct i2c_client          i2c_client;
314         int                        i2c_state, i2c_rc;
315         int                        i2c_done;
316         wait_queue_head_t          i2c_queue;
317
318         /* video4linux (1) */
319         struct video_device *video_dev;
320         struct video_device *radio_dev;
321         struct video_device *vbi_dev;
322
323         /* infrared remote */
324         int has_remote;
325         struct bttv_input *remote;
326
327         /* locking */
328         spinlock_t s_lock;
329         struct semaphore lock;
330         int resources;
331         struct semaphore reslock;
332 #ifdef VIDIOC_G_PRIORITY 
333         struct v4l2_prio_state prio;
334 #endif
335         
336         /* video state */
337         unsigned int input;
338         unsigned int audio;
339         unsigned long freq;
340         int tvnorm,hue,contrast,bright,saturation;
341         struct v4l2_framebuffer fbuf;
342         unsigned int field_count;
343
344         /* various options */
345         int opt_combfilter;
346         int opt_lumafilter;
347         int opt_automute;
348         int opt_chroma_agc;
349         int opt_adc_crush;
350         int opt_vcr_hack;
351         int opt_whitecrush_upper;
352         int opt_whitecrush_lower;
353
354         /* radio data/state */
355         int has_radio;
356         int radio_user;
357
358         /* miro/pinnacle + Aimslab VHX
359            philips matchbox (tea5757 radio tuner) support */
360         int has_matchbox;
361         int mbox_we;
362         int mbox_data;
363         int mbox_clk;
364         int mbox_most;
365         int mbox_mask;
366
367         /* ISA stuff (Terratec Active Radio Upgrade) */
368         int mbox_ior;
369         int mbox_iow;
370         int mbox_csel;
371
372         /* risc memory management data
373            - must aquire s_lock before changing these
374            - only the irq handler is supported to touch top + bottom + vcurr */
375         struct btcx_riscmem     main;
376         struct bttv_buffer      *screen;    /* overlay             */
377         struct list_head        capture;    /* video capture queue */
378         struct list_head        vcapture;   /* vbi capture queue   */
379         struct bttv_buffer_set  curr;       /* active buffers      */
380         int                     new_input;
381
382         unsigned long cap_ctl;
383         unsigned long dma_on;
384         struct timer_list timeout;
385         struct bttv_suspend_state state;
386
387         /* stats */
388         unsigned int errors;
389         unsigned int framedrop;
390         unsigned int irq_total;
391         unsigned int irq_me;
392
393         unsigned int users;
394         struct bttv_fh init;
395 };
396
397 /* private ioctls */
398 #define BTTV_VERSION            _IOR('v' , BASE_VIDIOCPRIVATE+6, int)
399 #define BTTV_VBISIZE            _IOR('v' , BASE_VIDIOCPRIVATE+8, int)
400
401 #endif
402
403 #define btwrite(dat,adr)    writel((dat), (char *) (btv->bt848_mmio+(adr)))
404 #define btread(adr)         readl(btv->bt848_mmio+(adr))
405
406 #define btand(dat,adr)      btwrite((dat) & btread(adr), adr)
407 #define btor(dat,adr)       btwrite((dat) | btread(adr), adr)
408 #define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
409
410 #endif /* _BTTVP_H_ */
411
412 /*
413  * Local variables:
414  * c-basic-offset: 8
415  * End:
416  */