vserver 1.9.3
[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,15)
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         unsigned int           irqflags;
131         unsigned int           topirq;
132 };
133
134 struct bttv_overlay {
135         int                    tvnorm;
136         struct v4l2_rect       w;
137         enum v4l2_field        field;
138         struct v4l2_clip       *clips;
139         int                    nclips;
140         int                    setup_ok;
141 };
142
143 struct bttv_fh {
144         struct bttv              *btv;
145         int resources;
146 #ifdef VIDIOC_G_PRIORITY 
147         enum v4l2_priority       prio;
148 #endif
149         enum v4l2_buf_type       type;
150
151         /* video capture */
152         struct videobuf_queue    cap;
153         const struct bttv_format *fmt;
154         int                      width;
155         int                      height;
156
157         /* current settings */
158         const struct bttv_format *ovfmt;
159         struct bttv_overlay      ov;
160
161         /* video overlay */
162         struct videobuf_queue    vbi;
163         int                      lines;
164 };
165
166 /* ---------------------------------------------------------- */
167 /* bttv-risc.c                                                */
168
169 /* risc code generators - capture */
170 int bttv_risc_packed(struct bttv *btv, struct btcx_riscmem *risc,
171                      struct scatterlist *sglist,
172                      unsigned int offset, unsigned int bpl,
173                      unsigned int pitch, unsigned int lines);
174 int bttv_risc_planar(struct bttv *btv, struct btcx_riscmem *risc,
175                      struct scatterlist *sglist,
176                      unsigned int yoffset,  unsigned int ybpl,
177                      unsigned int ypadding, unsigned int ylines,
178                      unsigned int uoffset,  unsigned int voffset,
179                      unsigned int hshift,   unsigned int vshift,
180                      unsigned int cpadding);
181 int bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc,
182                       const struct bttv_format *fmt,
183                       struct bttv_overlay *ov,
184                       int skip_top, int skip_bottom);
185
186 /* calculate / apply geometry settings */
187 void bttv_calc_geo(struct bttv *btv, struct bttv_geometry *geo,
188                    int width, int height, int interleaved, int norm);
189 void bttv_apply_geo(struct bttv *btv, struct bttv_geometry *geo, int top);
190
191 /* control dma register + risc main loop */
192 void bttv_set_dma(struct bttv *btv, int override, int irqflags);
193 int bttv_risc_init_main(struct bttv *btv);
194 int bttv_risc_hook(struct bttv *btv, int slot, struct btcx_riscmem *risc,
195                    int irqflags);
196
197 /* capture buffer handling */
198 int bttv_buffer_risc(struct bttv *btv, struct bttv_buffer *buf);
199 int bttv_buffer_activate_video(struct bttv *btv,
200                                struct bttv_buffer_set *set);
201 int bttv_buffer_activate_vbi(struct bttv *btv,
202                              struct bttv_buffer *vbi);
203 void bttv_dma_free(struct bttv *btv, struct bttv_buffer *buf);
204
205 /* overlay handling */
206 int bttv_overlay_risc(struct bttv *btv, struct bttv_overlay *ov,
207                       const struct bttv_format *fmt,
208                       struct bttv_buffer *buf);
209
210
211 /* ---------------------------------------------------------- */
212 /* bttv-vbi.c                                                 */
213
214 void bttv_vbi_try_fmt(struct bttv_fh *fh, struct v4l2_format *f);
215 void bttv_vbi_get_fmt(struct bttv_fh *fh, struct v4l2_format *f);
216 void bttv_vbi_setlines(struct bttv_fh *fh, struct bttv *btv, int lines);
217
218 extern struct videobuf_queue_ops bttv_vbi_qops;
219
220 /* ---------------------------------------------------------- */
221 /* bttv-gpio.c */
222
223
224 extern struct bus_type bttv_sub_bus_type;
225 int bttv_sub_add_device(struct bttv_core *core, char *name);
226 int bttv_sub_del_devices(struct bttv_core *core);
227 void bttv_gpio_irq(struct bttv_core *core);
228 void bttv_i2c_info(struct bttv_core *core, struct i2c_client *client, int attach);
229
230
231 /* ---------------------------------------------------------- */
232 /* bttv-driver.c                                              */
233
234 /* insmod options */
235 extern unsigned int bttv_verbose;
236 extern unsigned int bttv_debug;
237 extern unsigned int bttv_gpio;
238 extern void bttv_gpio_tracking(struct bttv *btv, char *comment);
239 extern int init_bttv_i2c(struct bttv *btv);
240 extern int fini_bttv_i2c(struct bttv *btv);
241 extern int pvr_boot(struct bttv *btv);
242
243 extern int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg);
244 extern void bttv_reinit_bt848(struct bttv *btv);
245 extern void bttv_field_count(struct bttv *btv);
246
247 #define vprintk  if (bttv_verbose) printk
248 #define dprintk  if (bttv_debug >= 1) printk
249 #define d2printk if (bttv_debug >= 2) printk
250
251 /* our devices */
252 #define BTTV_MAX 16
253 extern unsigned int bttv_num;
254 extern struct bttv bttvs[BTTV_MAX];
255
256 #define BTTV_MAX_FBUF   0x208000
257 #define VBIBUF_SIZE     (2048*VBI_MAXLINES*2)
258 #define BTTV_TIMEOUT    (HZ/2) /* 0.5 seconds */
259 #define BTTV_FREE_IDLE  (HZ)   /* one second */
260
261
262 struct bttv_pll_info {
263         unsigned int pll_ifreq;    /* PLL input frequency        */
264         unsigned int pll_ofreq;    /* PLL output frequency       */
265         unsigned int pll_crystal;  /* Crystal used for input     */
266         unsigned int pll_current;  /* Currently programmed ofreq */
267 };
268
269 /* for gpio-connected remote control */
270 struct bttv_input {
271         struct input_dev      dev;
272         struct ir_input_state ir;
273         char                  name[32];
274         char                  phys[32];
275         u32                   mask_keycode;
276         u32                   mask_keydown;
277 };
278
279 struct bttv_suspend_state {
280         u32  pci_cfg[64 / sizeof(u32)];
281         u32  gpio_enable;
282         u32  gpio_data;
283         int  disabled;
284         struct bttv_buffer_set video;
285         struct bttv_buffer     *vbi;
286 };
287
288 struct bttv {
289         struct bttv_core c;
290
291         /* pci device config */
292         unsigned short id;
293         unsigned char revision;
294         unsigned char *bt848_mmio;   /* pointer to mmio */
295
296         /* card configuration info */
297         unsigned int cardid;   /* pci subsystem id (bt878 based ones) */
298         unsigned int tuner_type;  /* tuner chip type */
299         unsigned int pinnacle_id;
300         unsigned int svhs;
301         struct bttv_pll_info pll;
302         int triton1;
303         int gpioirq;
304         int use_i2c_hw;
305
306         /* old gpio interface */
307         wait_queue_head_t gpioq;
308         int shutdown;
309         void (*audio_hook)(struct bttv *btv, struct video_audio *v, int set);
310
311         /* new gpio interface */
312         spinlock_t gpio_lock;
313
314         /* i2c layer */
315         struct i2c_algo_bit_data   i2c_algo;
316         struct i2c_client          i2c_client;
317         int                        i2c_state, i2c_rc;
318         int                        i2c_done;
319         wait_queue_head_t          i2c_queue;
320
321         /* video4linux (1) */
322         struct video_device *video_dev;
323         struct video_device *radio_dev;
324         struct video_device *vbi_dev;
325
326         /* infrared remote */
327         int has_remote;
328         struct bttv_input *remote;
329
330         /* locking */
331         spinlock_t s_lock;
332         struct semaphore lock;
333         int resources;
334         struct semaphore reslock;
335 #ifdef VIDIOC_G_PRIORITY 
336         struct v4l2_prio_state prio;
337 #endif
338         
339         /* video state */
340         unsigned int input;
341         unsigned int audio;
342         unsigned long freq;
343         int tvnorm,hue,contrast,bright,saturation;
344         struct v4l2_framebuffer fbuf;
345         unsigned int field_count;
346
347         /* various options */
348         int opt_combfilter;
349         int opt_lumafilter;
350         int opt_automute;
351         int opt_chroma_agc;
352         int opt_adc_crush;
353         int opt_vcr_hack;
354         int opt_whitecrush_upper;
355         int opt_whitecrush_lower;
356
357         /* radio data/state */
358         int has_radio;
359         int radio_user;
360
361         /* miro/pinnacle + Aimslab VHX
362            philips matchbox (tea5757 radio tuner) support */
363         int has_matchbox;
364         int mbox_we;
365         int mbox_data;
366         int mbox_clk;
367         int mbox_most;
368         int mbox_mask;
369
370         /* ISA stuff (Terratec Active Radio Upgrade) */
371         int mbox_ior;
372         int mbox_iow;
373         int mbox_csel;
374
375         /* risc memory management data
376            - must aquire s_lock before changing these
377            - only the irq handler is supported to touch top + bottom + vcurr */
378         struct btcx_riscmem     main;
379         struct bttv_buffer      *screen;    /* overlay             */
380         struct list_head        capture;    /* video capture queue */
381         struct list_head        vcapture;   /* vbi capture queue   */
382         struct bttv_buffer_set  curr;       /* active buffers      */
383         struct bttv_buffer      *cvbi;      /* active vbi buffer   */
384         int                     new_input;
385
386         unsigned long cap_ctl;
387         unsigned long dma_on;
388         struct timer_list timeout;
389         struct bttv_suspend_state state;
390
391         /* stats */
392         unsigned int errors;
393         unsigned int framedrop;
394         unsigned int irq_total;
395         unsigned int irq_me;
396
397         unsigned int users;
398         struct bttv_fh init;
399 };
400
401 /* private ioctls */
402 #define BTTV_VERSION            _IOR('v' , BASE_VIDIOCPRIVATE+6, int)
403 #define BTTV_VBISIZE            _IOR('v' , BASE_VIDIOCPRIVATE+8, int)
404
405 #endif
406
407 #define btwrite(dat,adr)    writel((dat), (char *) (btv->bt848_mmio+(adr)))
408 #define btread(adr)         readl(btv->bt848_mmio+(adr))
409
410 #define btand(dat,adr)      btwrite((dat) & btread(adr), adr)
411 #define btor(dat,adr)       btwrite((dat) | btread(adr), adr)
412 #define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
413
414 #endif /* _BTTVP_H_ */
415
416 /*
417  * Local variables:
418  * c-basic-offset: 8
419  * End:
420  */