VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / media / video / saa7134 / saa7134-video.c
1 /*
2  * device driver for philips saa7134 based TV cards
3  * video4linux video interface
4  *
5  * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2 of the License, or
10  *  (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21
22 #include <linux/init.h>
23 #include <linux/list.h>
24 #include <linux/module.h>
25 #include <linux/kernel.h>
26 #include <linux/slab.h>
27
28 #include "saa7134-reg.h"
29 #include "saa7134.h"
30
31 #define V4L2_I2C_CLIENTS 1
32
33 /* ------------------------------------------------------------------ */
34
35 static unsigned int video_debug   = 0;
36 static unsigned int gbuffers      = 8;
37 static unsigned int noninterlaced = 0;
38 static unsigned int gbufsize      = 720*576*4;
39 static unsigned int gbufsize_max  = 720*576*4;
40 MODULE_PARM(video_debug,"i");
41 MODULE_PARM_DESC(video_debug,"enable debug messages [video]");
42 MODULE_PARM(gbuffers,"i");
43 MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32");
44 MODULE_PARM(noninterlaced,"i");
45 MODULE_PARM_DESC(noninterlaced,"video input is noninterlaced");
46
47 #define dprintk(fmt, arg...)    if (video_debug) \
48         printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg)
49
50 /* ------------------------------------------------------------------ */
51 /* data structs for video                                             */
52
53 static int video_out[][9] = {
54         [CCIR656] = { 0x00, 0xb1, 0x00, 0xa1, 0x00, 0x04, 0x06, 0x00, 0x00 },
55 };
56                 
57 static struct saa7134_format formats[] = {
58         {
59                 .name     = "8 bpp gray",
60                 .fourcc   = V4L2_PIX_FMT_GREY,
61                 .depth    = 8,
62                 .pm       = 0x06,
63         },{
64                 .name     = "15 bpp RGB, le",
65                 .fourcc   = V4L2_PIX_FMT_RGB555,
66                 .depth    = 16,
67                 .pm       = 0x13 | 0x80,
68         },{
69                 .name     = "15 bpp RGB, be",
70                 .fourcc   = V4L2_PIX_FMT_RGB555X,
71                 .depth    = 16,
72                 .pm       = 0x13 | 0x80,
73                 .bswap    = 1,
74         },{
75                 .name     = "16 bpp RGB, le",
76                 .fourcc   = V4L2_PIX_FMT_RGB565,
77                 .depth    = 16,
78                 .pm       = 0x10 | 0x80,
79         },{
80                 .name     = "16 bpp RGB, be",
81                 .fourcc   = V4L2_PIX_FMT_RGB565X,
82                 .depth    = 16,
83                 .pm       = 0x10 | 0x80,
84                 .bswap    = 1,
85         },{
86                 .name     = "24 bpp RGB, le",
87                 .fourcc   = V4L2_PIX_FMT_BGR24,
88                 .depth    = 24,
89                 .pm       = 0x11,
90         },{
91                 .name     = "24 bpp RGB, be",
92                 .fourcc   = V4L2_PIX_FMT_RGB24,
93                 .depth    = 24,
94                 .pm       = 0x11,
95                 .bswap    = 1,
96         },{
97                 .name     = "32 bpp RGB, le",
98                 .fourcc   = V4L2_PIX_FMT_BGR32,
99                 .depth    = 32,
100                 .pm       = 0x12,
101         },{
102                 .name     = "32 bpp RGB, be",
103                 .fourcc   = V4L2_PIX_FMT_RGB32,
104                 .depth    = 32,
105                 .pm       = 0x12,
106                 .bswap    = 1,
107                 .wswap    = 1,
108         },{
109                 .name     = "4:2:2 packed, YUYV",
110                 .fourcc   = V4L2_PIX_FMT_YUYV,
111                 .depth    = 16,
112                 .pm       = 0x00,
113                 .bswap    = 1,
114                 .yuv      = 1,
115         },{
116                 .name     = "4:2:2 packed, UYVY",
117                 .fourcc   = V4L2_PIX_FMT_UYVY,
118                 .depth    = 16,
119                 .pm       = 0x00,
120                 .yuv      = 1,
121         },{
122                 .name     = "4:2:2 planar, Y-Cb-Cr",
123                 .fourcc   = V4L2_PIX_FMT_YUV422P,
124                 .depth    = 16,
125                 .pm       = 0x09,
126                 .yuv      = 1,
127                 .planar   = 1,
128                 .hshift   = 1,
129                 .vshift   = 0,
130         },{
131                 .name     = "4:2:0 planar, Y-Cb-Cr",
132                 .fourcc   = V4L2_PIX_FMT_YUV420,
133                 .depth    = 12,
134                 .pm       = 0x0a,
135                 .yuv      = 1,
136                 .planar   = 1,
137                 .hshift   = 1,
138                 .vshift   = 1,
139         },{
140                 .name     = "4:2:0 planar, Y-Cb-Cr",
141                 .fourcc   = V4L2_PIX_FMT_YVU420,
142                 .depth    = 12,
143                 .pm       = 0x0a,
144                 .yuv      = 1,
145                 .planar   = 1,
146                 .uvswap   = 1,
147                 .hshift   = 1,
148                 .vshift   = 1,
149         }
150 };
151 #define FORMATS ARRAY_SIZE(formats)
152
153 #define NORM_625_50                     \
154                 .h_start       = 0,     \
155                 .h_stop        = 719,   \
156                 .video_v_start = 24,    \
157                 .video_v_stop  = 311,   \
158                 .vbi_v_start   = 7,     \
159                 .vbi_v_stop    = 22,    \
160                 .src_timing    = 4
161
162 #define NORM_525_60                     \
163                 .h_start       = 0,     \
164                 .h_stop        = 703,   \
165                 .video_v_start = 22,    \
166                 .video_v_stop  = 22+239, \
167                 .vbi_v_start   = 10, /* FIXME */ \
168                 .vbi_v_stop    = 21, /* FIXME */ \
169                 .src_timing    = 1
170
171 static struct saa7134_tvnorm tvnorms[] = {
172         {
173                 .name          = "PAL", /* autodetect */
174                 .id            = V4L2_STD_PAL,
175                 NORM_625_50,
176
177                 .sync_control  = 0x18,
178                 .luma_control  = 0x40,
179                 .chroma_ctrl1  = 0x81,
180                 .chroma_gain   = 0x2a,
181                 .chroma_ctrl2  = 0x06,
182                 .vgate_misc    = 0x1c,
183
184         },{
185                 .name          = "PAL-BG",
186                 .id            = V4L2_STD_PAL_BG,
187                 NORM_625_50,
188
189                 .sync_control  = 0x18,
190                 .luma_control  = 0x40,
191                 .chroma_ctrl1  = 0x81,
192                 .chroma_gain   = 0x2a,
193                 .chroma_ctrl2  = 0x06,
194                 .vgate_misc    = 0x1c,
195
196         },{
197                 .name          = "PAL-I",
198                 .id            = V4L2_STD_PAL_I,
199                 NORM_625_50,
200
201                 .sync_control  = 0x18,
202                 .luma_control  = 0x40,
203                 .chroma_ctrl1  = 0x81,
204                 .chroma_gain   = 0x2a,
205                 .chroma_ctrl2  = 0x06,
206                 .vgate_misc    = 0x1c,
207
208         },{
209                 .name          = "PAL-DK",
210                 .id            = V4L2_STD_PAL_DK,
211                 NORM_625_50,
212
213                 .sync_control  = 0x18,
214                 .luma_control  = 0x40,
215                 .chroma_ctrl1  = 0x81,
216                 .chroma_gain   = 0x2a,
217                 .chroma_ctrl2  = 0x06,
218                 .vgate_misc    = 0x1c,
219
220         },{
221                 .name          = "NTSC",
222                 .id            = V4L2_STD_NTSC,
223                 NORM_525_60,
224
225                 .sync_control  = 0x59,
226                 .luma_control  = 0x40,
227                 .chroma_ctrl1  = 0x89,
228                 .chroma_gain   = 0x2a,
229                 .chroma_ctrl2  = 0x0e,
230                 .vgate_misc    = 0x18,
231
232         },{
233                 .name          = "SECAM",
234                 .id            = V4L2_STD_SECAM,
235                 NORM_625_50,
236
237                 .sync_control  = 0x18, /* old: 0x58, */
238                 .luma_control  = 0x1b,
239                 .chroma_ctrl1  = 0xd1,
240                 .chroma_gain   = 0x80,
241                 .chroma_ctrl2  = 0x00,
242                 .vgate_misc    = 0x1c,
243
244         },{
245                 .name          = "PAL-M",
246                 .id            = V4L2_STD_PAL_M,
247                 NORM_525_60,
248
249                 .sync_control  = 0x59,
250                 .luma_control  = 0x40,
251                 .chroma_ctrl1  = 0xb9,
252                 .chroma_gain   = 0x2a,
253                 .chroma_ctrl2  = 0x0e,
254                 .vgate_misc    = 0x18,
255
256         },{
257                 .name          = "PAL-Nc",
258                 .id            = V4L2_STD_PAL_Nc,
259                 NORM_625_50,
260
261                 .sync_control  = 0x18,
262                 .luma_control  = 0x40,
263                 .chroma_ctrl1  = 0xa1,
264                 .chroma_gain   = 0x2a,
265                 .chroma_ctrl2  = 0x06,
266                 .vgate_misc    = 0x1c,
267
268         }
269 };
270 #define TVNORMS ARRAY_SIZE(tvnorms)
271
272 #define V4L2_CID_PRIVATE_INVERT      (V4L2_CID_PRIVATE_BASE + 0)
273 #define V4L2_CID_PRIVATE_Y_ODD       (V4L2_CID_PRIVATE_BASE + 1)
274 #define V4L2_CID_PRIVATE_Y_EVEN      (V4L2_CID_PRIVATE_BASE + 2)
275 #define V4L2_CID_PRIVATE_LASTP1      (V4L2_CID_PRIVATE_BASE + 3)
276
277 static const struct v4l2_queryctrl no_ctrl = {
278         .name  = "42",
279         .flags = V4L2_CTRL_FLAG_DISABLED,
280 };
281 static const struct v4l2_queryctrl video_ctrls[] = {
282         /* --- video --- */
283         {
284                 .id            = V4L2_CID_BRIGHTNESS,
285                 .name          = "Brightness",
286                 .minimum       = 0,
287                 .maximum       = 255,
288                 .step          = 1,
289                 .default_value = 128,
290                 .type          = V4L2_CTRL_TYPE_INTEGER,
291         },{
292                 .id            = V4L2_CID_CONTRAST,
293                 .name          = "Contrast",
294                 .minimum       = 0,
295                 .maximum       = 127,
296                 .step          = 1,
297                 .default_value = 68,
298                 .type          = V4L2_CTRL_TYPE_INTEGER,
299         },{
300                 .id            = V4L2_CID_SATURATION,
301                 .name          = "Saturation",
302                 .minimum       = 0,
303                 .maximum       = 127,
304                 .step          = 1,
305                 .default_value = 64,
306                 .type          = V4L2_CTRL_TYPE_INTEGER,
307         },{
308                 .id            = V4L2_CID_HUE,
309                 .name          = "Hue",
310                 .minimum       = -128,
311                 .maximum       = 127,
312                 .step          = 1,
313                 .default_value = 0,
314                 .type          = V4L2_CTRL_TYPE_INTEGER,
315         },{
316                 .id            = V4L2_CID_VFLIP,
317                 .name          = "vertical flip",
318                 .minimum       = 0,
319                 .maximum       = 1,
320                 .type          = V4L2_CTRL_TYPE_BOOLEAN,
321         },
322         /* --- audio --- */
323         {
324                 .id            = V4L2_CID_AUDIO_MUTE,
325                 .name          = "Mute",
326                 .minimum       = 0,
327                 .maximum       = 1,
328                 .type          = V4L2_CTRL_TYPE_BOOLEAN,
329         },{
330                 .id            = V4L2_CID_AUDIO_VOLUME,
331                 .name          = "Volume",
332                 .minimum       = -15,
333                 .maximum       = 15,
334                 .step          = 1,
335                 .default_value = 0,
336                 .type          = V4L2_CTRL_TYPE_INTEGER,
337         },
338         /* --- private --- */
339         {
340                 .id            = V4L2_CID_PRIVATE_INVERT,
341                 .name          = "Invert",
342                 .minimum       = 0,
343                 .maximum       = 1,
344                 .type          = V4L2_CTRL_TYPE_BOOLEAN,
345         },{
346                 .id            = V4L2_CID_PRIVATE_Y_ODD,
347                 .name          = "y offset odd field",
348                 .minimum       = 0,
349                 .maximum       = 128,
350                 .default_value = 0,
351                 .type          = V4L2_CTRL_TYPE_INTEGER,
352         },{
353                 .id            = V4L2_CID_PRIVATE_Y_EVEN,
354                 .name          = "y offset even field",
355                 .minimum       = 0,
356                 .maximum       = 128,
357                 .default_value = 0,
358                 .type          = V4L2_CTRL_TYPE_INTEGER,
359         }
360 };
361 static const unsigned int CTRLS = ARRAY_SIZE(video_ctrls);
362
363 static const struct v4l2_queryctrl* ctrl_by_id(unsigned int id)
364 {
365         unsigned int i;
366         
367         for (i = 0; i < CTRLS; i++)
368                 if (video_ctrls[i].id == id)
369                         return video_ctrls+i;
370         return NULL;
371 }
372
373 static struct saa7134_format* format_by_fourcc(unsigned int fourcc)
374 {
375         unsigned int i;
376
377         for (i = 0; i < FORMATS; i++)
378                 if (formats[i].fourcc == fourcc)
379                         return formats+i;
380         return NULL;
381 }
382
383 /* ----------------------------------------------------------------------- */
384 /* resource management                                                     */
385
386 static int res_get(struct saa7134_dev *dev, struct saa7134_fh *fh, unsigned int bit)
387 {
388         if (fh->resources & bit)
389                 /* have it already allocated */
390                 return 1;
391
392         /* is it free? */
393         down(&dev->lock);
394         if (dev->resources & bit) {
395                 /* no, someone else uses it */
396                 up(&dev->lock);
397                 return 0;
398         }
399         /* it's free, grab it */
400         fh->resources  |= bit;
401         dev->resources |= bit;
402         dprintk("res: get %d\n",bit);
403         up(&dev->lock);
404         return 1;
405 }
406
407 static
408 int res_check(struct saa7134_fh *fh, unsigned int bit)
409 {
410         return (fh->resources & bit);
411 }
412
413 static
414 int res_locked(struct saa7134_dev *dev, unsigned int bit)
415 {
416         return (dev->resources & bit);
417 }
418
419 static
420 void res_free(struct saa7134_dev *dev, struct saa7134_fh *fh, unsigned int bits)
421 {
422         if ((fh->resources & bits) != bits)
423                 BUG();
424
425         down(&dev->lock);
426         fh->resources  &= ~bits;
427         dev->resources &= ~bits;
428         dprintk("res: put %d\n",bits);
429         up(&dev->lock);
430 }
431
432 /* ------------------------------------------------------------------ */
433
434 static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm)
435 {
436         int luma_control,sync_control,mux;
437
438         dprintk("set tv norm = %s\n",norm->name);
439         dev->tvnorm = norm;
440
441         mux = card_in(dev,dev->ctl_input).vmux;
442         luma_control = norm->luma_control;
443         sync_control = norm->sync_control;
444
445         if (mux > 5)
446                 luma_control |= 0x80; /* svideo */
447         if (noninterlaced)
448                 sync_control |= 0x20;
449
450         /* setup cropping */
451         dev->crop_bounds.left    = norm->h_start;
452         dev->crop_defrect.left   = norm->h_start;
453         dev->crop_bounds.width   = norm->h_stop - norm->h_start +1;
454         dev->crop_defrect.width  = norm->h_stop - norm->h_start +1;
455
456         dev->crop_bounds.top     = (norm->vbi_v_stop+1)*2;
457         dev->crop_defrect.top    = norm->video_v_start*2;
458         dev->crop_bounds.height  = ((norm->id & V4L2_STD_525_60) ? 524 : 624)
459                 - dev->crop_bounds.top;
460         dev->crop_defrect.height = (norm->video_v_stop - norm->video_v_start +1)*2;
461
462         dev->crop_current = dev->crop_defrect;
463
464         /* setup video decoder */
465         saa_writeb(SAA7134_INCR_DELAY,            0x08);
466         saa_writeb(SAA7134_ANALOG_IN_CTRL1,       0xc0 | mux);
467         saa_writeb(SAA7134_ANALOG_IN_CTRL2,       0x00);
468
469         saa_writeb(SAA7134_ANALOG_IN_CTRL3,       0x90);
470         saa_writeb(SAA7134_ANALOG_IN_CTRL4,       0x90);
471         saa_writeb(SAA7134_HSYNC_START,           0xeb);
472         saa_writeb(SAA7134_HSYNC_STOP,            0xe0);
473         saa_writeb(SAA7134_SOURCE_TIMING1,        norm->src_timing);
474         
475         saa_writeb(SAA7134_SYNC_CTRL,             sync_control);
476         saa_writeb(SAA7134_LUMA_CTRL,             luma_control);
477         saa_writeb(SAA7134_DEC_LUMA_BRIGHT,       dev->ctl_bright);
478         saa_writeb(SAA7134_DEC_LUMA_CONTRAST,     dev->ctl_contrast);
479  
480         saa_writeb(SAA7134_DEC_CHROMA_SATURATION, dev->ctl_saturation);
481         saa_writeb(SAA7134_DEC_CHROMA_HUE,        dev->ctl_hue);
482         saa_writeb(SAA7134_CHROMA_CTRL1,          norm->chroma_ctrl1);
483         saa_writeb(SAA7134_CHROMA_GAIN,           norm->chroma_gain);
484
485         saa_writeb(SAA7134_CHROMA_CTRL2,          norm->chroma_ctrl2);
486         saa_writeb(SAA7134_MODE_DELAY_CTRL,       0x00);
487
488         saa_writeb(SAA7134_ANALOG_ADC,            0x01);
489         saa_writeb(SAA7134_VGATE_START,           0x11);
490         saa_writeb(SAA7134_VGATE_STOP,            0xfe);
491         saa_writeb(SAA7134_MISC_VGATE_MSB,        norm->vgate_misc);
492         saa_writeb(SAA7134_RAW_DATA_GAIN,         0x40);
493         saa_writeb(SAA7134_RAW_DATA_OFFSET,       0x80);
494
495 #ifdef V4L2_I2C_CLIENTS
496         saa7134_i2c_call_clients(dev,VIDIOC_S_STD,&norm->id);
497 #else
498         {
499                 /* pass down info to the i2c chips (v4l1) */
500                 struct video_channel c;
501                 memset(&c,0,sizeof(c));
502                 c.channel = dev->ctl_input;
503                 c.norm = VIDEO_MODE_PAL;
504                 if (norm->id & V4L2_STD_NTSC)
505                         c.norm = VIDEO_MODE_NTSC;
506                 if (norm->id & V4L2_STD_SECAM)
507                         c.norm = VIDEO_MODE_SECAM;
508                 saa7134_i2c_call_clients(dev,VIDIOCSCHAN,&c);
509         }
510 #endif
511 }
512
513 static void video_mux(struct saa7134_dev *dev, int input)
514 {
515         dprintk("video input = %d [%s]\n",input,card_in(dev,input).name);
516         dev->ctl_input = input;
517         set_tvnorm(dev,dev->tvnorm);
518         saa7134_tvaudio_setinput(dev,&card_in(dev,input));
519 }
520
521 static void set_h_prescale(struct saa7134_dev *dev, int task, int prescale)
522 {
523         static const struct {
524                 int xpsc;
525                 int xacl;
526                 int xc2_1;
527                 int xdcg;
528                 int vpfy;
529         } vals[] = {
530                 /* XPSC XACL XC2_1 XDCG VPFY */
531                 {    1,   0,    0,    0,   0 },
532                 {    2,   2,    1,    2,   2 },
533                 {    3,   4,    1,    3,   2 },
534                 {    4,   8,    1,    4,   2 },
535                 {    5,   8,    1,    4,   2 },
536                 {    6,   8,    1,    4,   3 },
537                 {    7,   8,    1,    4,   3 },
538                 {    8,  15,    0,    4,   3 },
539                 {    9,  15,    0,    4,   3 },
540                 {   10,  16,    1,    5,   3 },
541         };
542         static const int count = ARRAY_SIZE(vals);
543         int i;
544
545         for (i = 0; i < count; i++)
546                 if (vals[i].xpsc == prescale)
547                         break;
548         if (i == count)
549                 return;
550
551         saa_writeb(SAA7134_H_PRESCALE(task), vals[i].xpsc);
552         saa_writeb(SAA7134_ACC_LENGTH(task), vals[i].xacl);
553         saa_writeb(SAA7134_LEVEL_CTRL(task),
554                    (vals[i].xc2_1 << 3) | (vals[i].xdcg));
555         saa_andorb(SAA7134_FIR_PREFILTER_CTRL(task), 0x0f,
556                    (vals[i].vpfy << 2) | vals[i].vpfy);
557 }
558
559 static void set_v_scale(struct saa7134_dev *dev, int task, int yscale)
560 {
561         int val,mirror;
562         
563         saa_writeb(SAA7134_V_SCALE_RATIO1(task), yscale &  0xff);
564         saa_writeb(SAA7134_V_SCALE_RATIO2(task), yscale >> 8);
565
566         mirror = (dev->ctl_mirror) ? 0x02 : 0x00;
567         if (yscale < 2048) {
568                 /* LPI */
569                 dprintk("yscale LPI yscale=%d\n",yscale);
570                 saa_writeb(SAA7134_V_FILTER(task), 0x00 | mirror);
571                 saa_writeb(SAA7134_LUMA_CONTRAST(task), 0x40);
572                 saa_writeb(SAA7134_CHROMA_SATURATION(task), 0x40);
573         } else {
574                 /* ACM */
575                 val = 0x40 * 1024 / yscale;
576                 dprintk("yscale ACM yscale=%d val=0x%x\n",yscale,val);
577                 saa_writeb(SAA7134_V_FILTER(task), 0x01 | mirror);
578                 saa_writeb(SAA7134_LUMA_CONTRAST(task), val);
579                 saa_writeb(SAA7134_CHROMA_SATURATION(task), val);
580         }
581         saa_writeb(SAA7134_LUMA_BRIGHT(task),       0x80);
582 }
583
584 static void set_size(struct saa7134_dev *dev, int task,
585                      int width, int height, int interlace)
586 {
587         int prescale,xscale,yscale,y_even,y_odd;
588         int h_start, h_stop, v_start, v_stop;
589         int div = interlace ? 2 : 1;
590
591         /* setup video scaler */
592         h_start = dev->crop_current.left;
593         v_start = dev->crop_current.top/2;
594         h_stop  = (dev->crop_current.left + dev->crop_current.width -1);
595         v_stop  = (dev->crop_current.top + dev->crop_current.height -1)/2;
596
597         saa_writeb(SAA7134_VIDEO_H_START1(task), h_start &  0xff);
598         saa_writeb(SAA7134_VIDEO_H_START2(task), h_start >> 8);
599         saa_writeb(SAA7134_VIDEO_H_STOP1(task),  h_stop  &  0xff);
600         saa_writeb(SAA7134_VIDEO_H_STOP2(task),  h_stop  >> 8);
601         saa_writeb(SAA7134_VIDEO_V_START1(task), v_start &  0xff);
602         saa_writeb(SAA7134_VIDEO_V_START2(task), v_start >> 8);
603         saa_writeb(SAA7134_VIDEO_V_STOP1(task),  v_stop  &  0xff);
604         saa_writeb(SAA7134_VIDEO_V_STOP2(task),  v_stop  >> 8);
605
606         prescale = dev->crop_current.width / width;
607         if (0 == prescale)
608                 prescale = 1;
609         xscale = 1024 * dev->crop_current.width / prescale / width;
610         yscale = 512 * div * dev->crop_current.height / height;
611         dprintk("prescale=%d xscale=%d yscale=%d\n",prescale,xscale,yscale);
612         set_h_prescale(dev,task,prescale);
613         saa_writeb(SAA7134_H_SCALE_INC1(task),      xscale &  0xff);
614         saa_writeb(SAA7134_H_SCALE_INC2(task),      xscale >> 8);
615         set_v_scale(dev,task,yscale);
616         
617         saa_writeb(SAA7134_VIDEO_PIXELS1(task),     width  & 0xff);
618         saa_writeb(SAA7134_VIDEO_PIXELS2(task),     width  >> 8);
619         saa_writeb(SAA7134_VIDEO_LINES1(task),      height/div & 0xff);
620         saa_writeb(SAA7134_VIDEO_LINES2(task),      height/div >> 8);
621
622         /* deinterlace y offsets */
623         y_odd  = dev->ctl_y_odd;
624         y_even = dev->ctl_y_even;
625         saa_writeb(SAA7134_V_PHASE_OFFSET0(task), y_odd);
626         saa_writeb(SAA7134_V_PHASE_OFFSET1(task), y_even);
627         saa_writeb(SAA7134_V_PHASE_OFFSET2(task), y_odd);
628         saa_writeb(SAA7134_V_PHASE_OFFSET3(task), y_even);
629 }
630
631 /* ------------------------------------------------------------------ */
632
633 struct cliplist {
634         __u16 position;
635         __u8  enable;
636         __u8  disable;
637 };
638
639 static void sort_cliplist(struct cliplist *cl, int entries)
640 {
641         struct cliplist swap;
642         int i,j,n;
643         
644         for (i = entries-2; i >= 0; i--) {
645                 for (n = 0, j = 0; j <= i; j++) {
646                         if (cl[j].position > cl[j+1].position) {
647                                 swap = cl[j];
648                                 cl[j] = cl[j+1];
649                                 cl[j+1] = swap;
650                                 n++;
651                         }
652                 }
653                 if (0 == n)
654                         break;
655         }
656 }
657
658 static void set_cliplist(struct saa7134_dev *dev, int reg,
659                         struct cliplist *cl, int entries, char *name)
660 {
661         __u8 winbits = 0;
662         int i;
663
664         for (i = 0; i < entries; i++) {
665                 winbits |= cl[i].enable;
666                 winbits &= ~cl[i].disable;
667                 if (i < 15 && cl[i].position == cl[i+1].position)
668                         continue;
669                 saa_writeb(reg + 0, winbits);
670                 saa_writeb(reg + 2, cl[i].position & 0xff);
671                 saa_writeb(reg + 3, cl[i].position >> 8);
672                 dprintk("clip: %s winbits=%02x pos=%d\n",
673                         name,winbits,cl[i].position);
674                 reg += 8;
675         }
676         for (; reg < 0x400; reg += 8) {
677                 saa_writeb(reg+ 0, 0);
678                 saa_writeb(reg + 1, 0);
679                 saa_writeb(reg + 2, 0);
680                 saa_writeb(reg + 3, 0);
681         }
682 }
683
684 static int clip_range(int val)
685 {
686         if (val < 0)
687                 val = 0;
688         return val;
689 }
690
691 static int setup_clipping(struct saa7134_dev *dev, struct v4l2_clip *clips,
692                           int nclips, int interlace)
693 {
694         struct cliplist col[16], row[16];
695         int cols, rows, i;
696         int div = interlace ? 2 : 1;
697
698         memset(col,0,sizeof(col)); cols = 0;
699         memset(row,0,sizeof(row)); rows = 0;
700         for (i = 0; i < nclips && i < 8; i++) {
701                 col[cols].position = clip_range(clips[i].c.left);
702                 col[cols].enable   = (1 << i);
703                 cols++;
704                 col[cols].position = clip_range(clips[i].c.left+clips[i].c.width);
705                 col[cols].disable  = (1 << i);
706                 cols++;
707                 row[rows].position = clip_range(clips[i].c.top / div);
708                 row[rows].enable   = (1 << i);
709                 rows++;
710                 row[rows].position = clip_range((clips[i].c.top + clips[i].c.height)
711                                                 / div);
712                 row[rows].disable  = (1 << i);
713                 rows++;
714         }
715         sort_cliplist(col,cols);
716         sort_cliplist(row,rows);
717         set_cliplist(dev,0x380,col,cols,"cols");
718         set_cliplist(dev,0x384,row,rows,"rows");
719         return 0;
720 }
721
722 static int verify_preview(struct saa7134_dev *dev, struct v4l2_window *win)
723 {
724         enum v4l2_field field;
725         int maxw, maxh;
726
727         if (NULL == dev->ovbuf.base)
728                 return -EINVAL;
729         if (NULL == dev->ovfmt)
730                 return -EINVAL;
731         if (win->w.width < 48 || win->w.height <  32)
732                 return -EINVAL;
733         if (win->clipcount > 2048)
734                 return -EINVAL;
735
736         field = win->field;
737         maxw  = dev->crop_current.width;
738         maxh  = dev->crop_current.height;
739
740         if (V4L2_FIELD_ANY == field) {
741                 field = (win->w.height > maxh/2)
742                         ? V4L2_FIELD_INTERLACED
743                         : V4L2_FIELD_TOP;
744         }
745         switch (field) {
746         case V4L2_FIELD_TOP:
747         case V4L2_FIELD_BOTTOM:
748                 maxh = maxh / 2;
749                 break;
750         case V4L2_FIELD_INTERLACED:
751                 break;
752         default:
753                 return -EINVAL;
754         }
755
756         win->field = field;
757         if (win->w.width > maxw)
758                 win->w.width = maxw;
759         if (win->w.height > maxh)
760                 win->w.height = maxh;
761         return 0;
762 }
763
764 static int start_preview(struct saa7134_dev *dev, struct saa7134_fh *fh)
765 {
766         unsigned long base,control,bpl;
767         int err;
768
769         err = verify_preview(dev,&fh->win);
770         if (0 != err)
771                 return err;
772
773         dev->ovfield = fh->win.field;
774         dprintk("start_preview %dx%d+%d+%d %s field=%s\n",
775                 fh->win.w.width,fh->win.w.height,
776                 fh->win.w.left,fh->win.w.top,
777                 dev->ovfmt->name,v4l2_field_names[dev->ovfield]);
778
779         /* setup window + clipping */
780         set_size(dev,TASK_B,fh->win.w.width,fh->win.w.height,
781                  V4L2_FIELD_HAS_BOTH(dev->ovfield));
782         setup_clipping(dev,fh->clips,fh->nclips,
783                        V4L2_FIELD_HAS_BOTH(dev->ovfield));
784         if (dev->ovfmt->yuv)
785                 saa_andorb(SAA7134_DATA_PATH(TASK_B), 0x3f, 0x03);
786         else
787                 saa_andorb(SAA7134_DATA_PATH(TASK_B), 0x3f, 0x01);
788         saa_writeb(SAA7134_OFMT_VIDEO_B, dev->ovfmt->pm | 0x20);
789
790         /* dma: setup channel 1 (= Video Task B) */
791         base  = (unsigned long)dev->ovbuf.base;
792         base += dev->ovbuf.fmt.bytesperline * fh->win.w.top;
793         base += dev->ovfmt->depth/8         * fh->win.w.left;
794         bpl   = dev->ovbuf.fmt.bytesperline;
795         control = SAA7134_RS_CONTROL_BURST_16;
796         if (dev->ovfmt->bswap)
797                 control |= SAA7134_RS_CONTROL_BSWAP;
798         if (dev->ovfmt->wswap)
799                 control |= SAA7134_RS_CONTROL_WSWAP;
800         if (V4L2_FIELD_HAS_BOTH(dev->ovfield)) {
801                 saa_writel(SAA7134_RS_BA1(1),base);
802                 saa_writel(SAA7134_RS_BA2(1),base+bpl);
803                 saa_writel(SAA7134_RS_PITCH(1),bpl*2);
804                 saa_writel(SAA7134_RS_CONTROL(1),control);
805         } else {
806                 saa_writel(SAA7134_RS_BA1(1),base);
807                 saa_writel(SAA7134_RS_BA2(1),base);
808                 saa_writel(SAA7134_RS_PITCH(1),bpl);
809                 saa_writel(SAA7134_RS_CONTROL(1),control);
810         }
811
812         /* start dma */
813         dev->ovenable = 1;
814         saa7134_set_dmabits(dev);
815
816         return 0;
817 }
818
819 static int stop_preview(struct saa7134_dev *dev, struct saa7134_fh *fh)
820 {
821         dev->ovenable = 0;
822         saa7134_set_dmabits(dev);
823         return 0;
824 }
825
826 /* ------------------------------------------------------------------ */
827
828 static int buffer_activate(struct saa7134_dev *dev,
829                            struct saa7134_buf *buf,
830                            struct saa7134_buf *next)
831 {
832         unsigned long base,control,bpl;
833         unsigned long bpl_uv,lines_uv,base2,base3,tmp; /* planar */
834
835         dprintk("buffer_activate buf=%p\n",buf);
836         buf->vb.state = STATE_ACTIVE;
837         buf->top_seen = 0;
838         
839         set_size(dev,TASK_A,buf->vb.width,buf->vb.height,
840                  V4L2_FIELD_HAS_BOTH(buf->vb.field));
841         if (buf->fmt->yuv)
842                 saa_andorb(SAA7134_DATA_PATH(TASK_A), 0x3f, 0x03);
843         else
844                 saa_andorb(SAA7134_DATA_PATH(TASK_A), 0x3f, 0x01);
845         saa_writeb(SAA7134_OFMT_VIDEO_A, buf->fmt->pm);
846
847         /* DMA: setup channel 0 (= Video Task A0) */
848         base  = saa7134_buffer_base(buf);
849         if (buf->fmt->planar)
850                 bpl = buf->vb.width;
851         else
852                 bpl = (buf->vb.width * buf->fmt->depth) / 8;
853         control = SAA7134_RS_CONTROL_BURST_16 |
854                 SAA7134_RS_CONTROL_ME |
855                 (buf->pt->dma >> 12);
856         if (buf->fmt->bswap)
857                 control |= SAA7134_RS_CONTROL_BSWAP;
858         if (buf->fmt->wswap)
859                 control |= SAA7134_RS_CONTROL_WSWAP;
860         if (V4L2_FIELD_HAS_BOTH(buf->vb.field)) {
861                 /* interlaced */
862                 saa_writel(SAA7134_RS_BA1(0),base);
863                 saa_writel(SAA7134_RS_BA2(0),base+bpl);
864                 saa_writel(SAA7134_RS_PITCH(0),bpl*2);
865         } else {
866                 /* non-interlaced */
867                 saa_writel(SAA7134_RS_BA1(0),base);
868                 saa_writel(SAA7134_RS_BA2(0),base);
869                 saa_writel(SAA7134_RS_PITCH(0),bpl);
870         }
871         saa_writel(SAA7134_RS_CONTROL(0),control);
872
873         if (buf->fmt->planar) {
874                 /* DMA: setup channel 4+5 (= planar task A) */
875                 bpl_uv   = bpl >> buf->fmt->hshift;
876                 lines_uv = buf->vb.height >> buf->fmt->vshift;
877                 base2    = base + bpl * buf->vb.height;
878                 base3    = base2 + bpl_uv * lines_uv;
879                 if (buf->fmt->uvswap)
880                         tmp = base2, base2 = base3, base3 = tmp;
881                 dprintk("uv: bpl=%ld lines=%ld base2/3=%ld/%ld\n",
882                         bpl_uv,lines_uv,base2,base3);
883                 if (V4L2_FIELD_HAS_BOTH(buf->vb.field)) {
884                         /* interlaced */
885                         saa_writel(SAA7134_RS_BA1(4),base2);
886                         saa_writel(SAA7134_RS_BA2(4),base2+bpl_uv);
887                         saa_writel(SAA7134_RS_PITCH(4),bpl_uv*2);
888                         saa_writel(SAA7134_RS_BA1(5),base3);
889                         saa_writel(SAA7134_RS_BA2(5),base3+bpl_uv);
890                         saa_writel(SAA7134_RS_PITCH(5),bpl_uv*2);
891                 } else {
892                         /* non-interlaced */
893                         saa_writel(SAA7134_RS_BA1(4),base2);
894                         saa_writel(SAA7134_RS_BA2(4),base2);
895                         saa_writel(SAA7134_RS_PITCH(4),bpl_uv);
896                         saa_writel(SAA7134_RS_BA1(5),base3);
897                         saa_writel(SAA7134_RS_BA2(5),base3);
898                         saa_writel(SAA7134_RS_PITCH(5),bpl_uv);
899                 }
900                 saa_writel(SAA7134_RS_CONTROL(4),control);
901                 saa_writel(SAA7134_RS_CONTROL(5),control);
902         }
903
904         /* start DMA */
905         saa7134_set_dmabits(dev);
906         mod_timer(&dev->video_q.timeout, jiffies+BUFFER_TIMEOUT);
907         return 0;
908 }
909
910 static int buffer_prepare(struct file *file, struct videobuf_buffer *vb,
911                           enum v4l2_field field)
912 {
913         struct saa7134_fh *fh = file->private_data;
914         struct saa7134_dev *dev = fh->dev;
915         struct saa7134_buf *buf = (struct saa7134_buf *)vb;
916         unsigned int size;
917         int err;
918         
919         /* sanity checks */
920         if (NULL == fh->fmt)
921                 return -EINVAL;
922         if (fh->width    < 48 ||
923             fh->height   < 32 ||
924             fh->width/4  > dev->crop_current.width  ||
925             fh->height/4 > dev->crop_current.height ||
926             fh->width    > dev->crop_bounds.width  ||
927             fh->height   > dev->crop_bounds.height)
928                 return -EINVAL;
929         size = (fh->width * fh->height * fh->fmt->depth) >> 3;
930         if (0 != buf->vb.baddr  &&  buf->vb.bsize < size)
931                 return -EINVAL;
932
933         dprintk("buffer_prepare [%d,size=%dx%d,bytes=%d,fields=%s,%s]\n",
934                 vb->i,fh->width,fh->height,size,v4l2_field_names[field],
935                 fh->fmt->name);
936         if (buf->vb.width  != fh->width  ||
937             buf->vb.height != fh->height ||
938             buf->vb.size   != size       ||
939             buf->vb.field  != field      ||
940             buf->fmt       != fh->fmt) {
941                 saa7134_dma_free(dev,buf);
942         }
943
944         if (STATE_NEEDS_INIT == buf->vb.state) {
945                 buf->vb.width  = fh->width;
946                 buf->vb.height = fh->height;
947                 buf->vb.size   = size;
948                 buf->vb.field  = field;
949                 buf->fmt       = fh->fmt;
950                 buf->pt        = &fh->pt_cap;
951
952                 err = videobuf_iolock(dev->pci,&buf->vb,&dev->ovbuf);
953                 if (err)
954                         goto oops;
955                 err = saa7134_pgtable_build(dev->pci,buf->pt,
956                                             buf->vb.dma.sglist,
957                                             buf->vb.dma.sglen,
958                                             saa7134_buffer_startpage(buf));
959                 if (err)
960                         goto oops;
961         }
962         buf->vb.state = STATE_PREPARED;
963         buf->activate = buffer_activate;
964         return 0;
965
966  oops:
967         saa7134_dma_free(dev,buf);
968         return err;
969 }
970
971 static int
972 buffer_setup(struct file *file, unsigned int *count, unsigned int *size)
973 {
974         struct saa7134_fh *fh = file->private_data;
975
976         *size = fh->fmt->depth * fh->width * fh->height >> 3;
977         if (0 == *count)
978                 *count = gbuffers;
979         *count = saa7134_buffer_count(*size,*count);
980         return 0;
981 }
982
983 static void buffer_queue(struct file *file, struct videobuf_buffer *vb)
984 {
985         struct saa7134_fh *fh = file->private_data;
986         struct saa7134_buf *buf = (struct saa7134_buf *)vb;
987         
988         saa7134_buffer_queue(fh->dev,&fh->dev->video_q,buf);
989 }
990
991 static void buffer_release(struct file *file, struct videobuf_buffer *vb)
992 {
993         struct saa7134_fh *fh = file->private_data;
994         struct saa7134_buf *buf = (struct saa7134_buf *)vb;
995         
996         saa7134_dma_free(fh->dev,buf);
997 }
998
999 static struct videobuf_queue_ops video_qops = {
1000         .buf_setup    = buffer_setup,
1001         .buf_prepare  = buffer_prepare,
1002         .buf_queue    = buffer_queue,
1003         .buf_release  = buffer_release,
1004 };
1005
1006 /* ------------------------------------------------------------------ */
1007
1008 static int get_control(struct saa7134_dev *dev, struct v4l2_control *c)
1009 {
1010         const struct v4l2_queryctrl* ctrl;
1011
1012         ctrl = ctrl_by_id(c->id);
1013         if (NULL == ctrl)
1014                 return -EINVAL;
1015         switch (c->id) {
1016         case V4L2_CID_BRIGHTNESS:
1017                 c->value = dev->ctl_bright;
1018                 break;
1019         case V4L2_CID_HUE:
1020                 c->value = dev->ctl_hue;
1021                 break;
1022         case V4L2_CID_CONTRAST:
1023                 c->value = dev->ctl_contrast;
1024                 break;
1025         case V4L2_CID_SATURATION:
1026                 c->value = dev->ctl_saturation;
1027                 break;
1028         case V4L2_CID_AUDIO_MUTE:
1029                 c->value = dev->ctl_mute;
1030                 break;
1031         case V4L2_CID_AUDIO_VOLUME:
1032                 c->value = dev->ctl_volume;
1033                 break;
1034         case V4L2_CID_PRIVATE_INVERT:
1035                 c->value = dev->ctl_invert;
1036                 break;
1037         case V4L2_CID_VFLIP:
1038                 c->value = dev->ctl_mirror;
1039                 break;
1040         case V4L2_CID_PRIVATE_Y_EVEN:
1041                 c->value = dev->ctl_y_even;
1042                 break;
1043         case V4L2_CID_PRIVATE_Y_ODD:
1044                 c->value = dev->ctl_y_odd;
1045                 break;
1046         default:
1047                 return -EINVAL;
1048         }
1049         return 0;
1050 }
1051
1052 static int set_control(struct saa7134_dev *dev, struct saa7134_fh *fh,
1053                        struct v4l2_control *c)
1054 {
1055         const struct v4l2_queryctrl* ctrl;
1056         unsigned long flags;
1057         int restart_overlay = 0;
1058
1059         ctrl = ctrl_by_id(c->id);
1060         if (NULL == ctrl)
1061                 return -EINVAL;
1062         dprintk("set_control name=%s val=%d\n",ctrl->name,c->value);
1063         switch (ctrl->type) {
1064         case V4L2_CTRL_TYPE_BOOLEAN:
1065         case V4L2_CTRL_TYPE_MENU:
1066         case V4L2_CTRL_TYPE_INTEGER:
1067                 if (c->value < ctrl->minimum)
1068                         c->value = ctrl->minimum;
1069                 if (c->value > ctrl->maximum)
1070                         c->value = ctrl->maximum;
1071                 break;
1072         default:
1073                 /* nothing */;
1074         };
1075         switch (c->id) {
1076         case V4L2_CID_BRIGHTNESS:
1077                 dev->ctl_bright = c->value;
1078                 saa_writeb(SAA7134_DEC_LUMA_BRIGHT, dev->ctl_bright);
1079                 break;
1080         case V4L2_CID_HUE:
1081                 dev->ctl_hue = c->value;
1082                 saa_writeb(SAA7134_DEC_CHROMA_HUE, dev->ctl_hue);
1083                 break;
1084         case V4L2_CID_CONTRAST:
1085                 dev->ctl_contrast = c->value;
1086                 saa_writeb(SAA7134_DEC_LUMA_CONTRAST,
1087                            dev->ctl_invert ? -dev->ctl_contrast : dev->ctl_contrast);
1088                 break;
1089         case V4L2_CID_SATURATION:
1090                 dev->ctl_saturation = c->value;
1091                 saa_writeb(SAA7134_DEC_CHROMA_SATURATION,
1092                            dev->ctl_invert ? -dev->ctl_saturation : dev->ctl_saturation);
1093                 break;
1094         case V4L2_CID_AUDIO_MUTE:
1095                 dev->ctl_mute = c->value;
1096                 saa7134_tvaudio_setmute(dev);
1097                 break;
1098         case V4L2_CID_AUDIO_VOLUME:
1099                 dev->ctl_volume = c->value;
1100                 saa7134_tvaudio_setvolume(dev,dev->ctl_volume);
1101                 break;
1102         case V4L2_CID_PRIVATE_INVERT:
1103                 dev->ctl_invert = c->value;
1104                 saa_writeb(SAA7134_DEC_LUMA_CONTRAST,
1105                            dev->ctl_invert ? -dev->ctl_contrast : dev->ctl_contrast);
1106                 saa_writeb(SAA7134_DEC_CHROMA_SATURATION,
1107                            dev->ctl_invert ? -dev->ctl_saturation : dev->ctl_saturation);
1108                 break;
1109         case V4L2_CID_VFLIP:
1110                 dev->ctl_mirror = c->value;
1111                 restart_overlay = 1;
1112                 break;
1113         case V4L2_CID_PRIVATE_Y_EVEN:
1114                 dev->ctl_y_even = c->value;
1115                 restart_overlay = 1;
1116                 break;
1117         case V4L2_CID_PRIVATE_Y_ODD:
1118                 dev->ctl_y_odd = c->value;
1119                 restart_overlay = 1;
1120                 break;
1121         default:
1122                 return -EINVAL;
1123         }
1124         if (restart_overlay && fh && res_check(fh, RESOURCE_OVERLAY)) {
1125                 spin_lock_irqsave(&dev->slock,flags);
1126                 stop_preview(dev,fh);
1127                 start_preview(dev,fh);
1128                 spin_unlock_irqrestore(&dev->slock,flags);
1129         }
1130         return 0;
1131 }
1132
1133 /* ------------------------------------------------------------------ */
1134
1135 static struct videobuf_queue* saa7134_queue(struct saa7134_fh *fh)
1136 {
1137         struct videobuf_queue* q = NULL;
1138         
1139         switch (fh->type) {
1140         case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1141                 q = &fh->cap;
1142                 break;
1143         case V4L2_BUF_TYPE_VBI_CAPTURE:
1144                 q = &fh->vbi;
1145                 break;
1146         default:
1147                 BUG();
1148         }
1149         return q;
1150 }
1151
1152 static int saa7134_resource(struct saa7134_fh *fh)
1153 {
1154         int res = 0;
1155         
1156         switch (fh->type) {
1157         case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1158                 res = RESOURCE_VIDEO;
1159                 break;
1160         case V4L2_BUF_TYPE_VBI_CAPTURE:
1161                 res = RESOURCE_VBI;
1162                 break;
1163         default:
1164                 BUG();
1165         }
1166         return res;
1167 }
1168
1169 static int video_open(struct inode *inode, struct file *file)
1170 {
1171         int minor = iminor(inode);
1172         struct saa7134_dev *h,*dev = NULL;
1173         struct saa7134_fh *fh;
1174         struct list_head *list;
1175         enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1176         int radio = 0;
1177         
1178         list_for_each(list,&saa7134_devlist) {
1179                 h = list_entry(list, struct saa7134_dev, devlist);
1180                 if (h->video_dev && (h->video_dev->minor == minor))
1181                         dev = h;
1182                 if (h->radio_dev && (h->radio_dev->minor == minor)) {
1183                         radio = 1;
1184                         dev = h;
1185                 }
1186                 if (h->vbi_dev && (h->vbi_dev->minor == minor)) {
1187                         type = V4L2_BUF_TYPE_VBI_CAPTURE;
1188                         dev = h;
1189                 }
1190         }
1191         if (NULL == dev)
1192                 return -ENODEV;
1193
1194         dprintk("open minor=%d radio=%d type=%s\n",minor,radio,
1195                 v4l2_type_names[type]);
1196
1197         /* allocate + initialize per filehandle data */
1198         fh = kmalloc(sizeof(*fh),GFP_KERNEL);
1199         if (NULL == fh)
1200                 return -ENOMEM;
1201         memset(fh,0,sizeof(*fh));
1202         file->private_data = fh;
1203         fh->dev      = dev;
1204         fh->radio    = radio;
1205         fh->type     = type;
1206         fh->fmt      = format_by_fourcc(V4L2_PIX_FMT_BGR24);
1207         fh->width    = 720;
1208         fh->height   = 576;
1209 #ifdef VIDIOC_G_PRIORITY
1210         v4l2_prio_open(&dev->prio,&fh->prio);
1211 #endif
1212
1213         videobuf_queue_init(&fh->cap, &video_qops,
1214                             dev->pci, &dev->slock,
1215                             V4L2_BUF_TYPE_VIDEO_CAPTURE,
1216                             V4L2_FIELD_INTERLACED,
1217                             sizeof(struct saa7134_buf));
1218         init_MUTEX(&fh->cap.lock);
1219         saa7134_pgtable_alloc(dev->pci,&fh->pt_cap);
1220
1221         videobuf_queue_init(&fh->vbi, &saa7134_vbi_qops,
1222                             dev->pci, &dev->slock,
1223                             V4L2_BUF_TYPE_VBI_CAPTURE,
1224                             V4L2_FIELD_SEQ_TB,
1225                             sizeof(struct saa7134_buf));
1226         init_MUTEX(&fh->vbi.lock);
1227         saa7134_pgtable_alloc(dev->pci,&fh->pt_vbi);
1228
1229         if (fh->radio) {
1230                 /* switch to radio mode */
1231                 saa7134_tvaudio_setinput(dev,&card(dev).radio);
1232                 saa7134_i2c_call_clients(dev,AUDC_SET_RADIO,NULL);
1233         } else {
1234                 /* switch to video/vbi mode */
1235                 video_mux(dev,dev->ctl_input);
1236         }
1237         return 0;
1238 }
1239
1240 static ssize_t
1241 video_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
1242 {
1243         struct saa7134_fh *fh = file->private_data;
1244
1245         switch (fh->type) {
1246         case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1247                 if (res_locked(fh->dev,RESOURCE_VIDEO))
1248                         return -EBUSY;
1249                 return videobuf_read_one(file, saa7134_queue(fh),
1250                                          data, count, ppos);
1251         case V4L2_BUF_TYPE_VBI_CAPTURE:
1252                 if (!res_get(fh->dev,fh,RESOURCE_VBI))
1253                         return -EBUSY;
1254                 return videobuf_read_stream(file, saa7134_queue(fh),
1255                                             data, count, ppos, 1);
1256                 break;
1257         default:
1258                 BUG();
1259                 return 0;
1260         }
1261 }
1262
1263 static unsigned int
1264 video_poll(struct file *file, struct poll_table_struct *wait)
1265 {
1266         struct saa7134_fh *fh = file->private_data;
1267         struct videobuf_buffer *buf = NULL;
1268
1269         if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type)
1270                 return videobuf_poll_stream(file, &fh->vbi, wait);
1271
1272         if (res_check(fh,RESOURCE_VIDEO)) {
1273                 if (!list_empty(&fh->cap.stream))
1274                         buf = list_entry(fh->cap.stream.next, struct videobuf_buffer, stream);
1275         } else {
1276                 down(&fh->cap.lock);
1277                 if (UNSET == fh->cap.read_off) {
1278                         /* need to capture a new frame */
1279                         if (res_locked(fh->dev,RESOURCE_VIDEO)) {
1280                                 up(&fh->cap.lock);
1281                                 return POLLERR;
1282                         }
1283                         if (0 != fh->cap.ops->buf_prepare(file,fh->cap.read_buf,fh->cap.field)) {
1284                                 up(&fh->cap.lock);
1285                                 return POLLERR;
1286                         }
1287                         fh->cap.ops->buf_queue(file,fh->cap.read_buf);
1288                         fh->cap.read_off = 0;
1289                 }
1290                 up(&fh->cap.lock);
1291                 buf = fh->cap.read_buf;
1292         }
1293
1294         if (!buf)
1295                 return POLLERR;
1296
1297         poll_wait(file, &buf->done, wait);
1298         if (buf->state == STATE_DONE ||
1299             buf->state == STATE_ERROR)
1300                 return POLLIN|POLLRDNORM;
1301         return 0;
1302 }
1303
1304 static int video_release(struct inode *inode, struct file *file)
1305 {
1306         struct saa7134_fh  *fh  = file->private_data;
1307         struct saa7134_dev *dev = fh->dev;
1308         unsigned long flags;
1309
1310         /* turn off overlay */
1311         if (res_check(fh, RESOURCE_OVERLAY)) {
1312                 spin_lock_irqsave(&dev->slock,flags);
1313                 stop_preview(dev,fh);
1314                 spin_unlock_irqrestore(&dev->slock,flags);
1315                 res_free(dev,fh,RESOURCE_OVERLAY);
1316         }
1317
1318         /* stop video capture */
1319         if (res_check(fh, RESOURCE_VIDEO)) {
1320                 videobuf_streamoff(file,&fh->cap);
1321                 res_free(dev,fh,RESOURCE_VIDEO);
1322         }
1323         if (fh->cap.read_buf) {
1324                 buffer_release(file,fh->cap.read_buf);
1325                 kfree(fh->cap.read_buf);
1326         }
1327
1328         /* stop vbi capture */
1329         if (res_check(fh, RESOURCE_VBI)) {
1330                 if (fh->vbi.streaming)
1331                         videobuf_streamoff(file,&fh->vbi);
1332                 if (fh->vbi.reading)
1333                         videobuf_read_stop(file,&fh->vbi);
1334                 res_free(dev,fh,RESOURCE_VBI);
1335         }
1336
1337         saa7134_pgtable_free(dev->pci,&fh->pt_cap);
1338         saa7134_pgtable_free(dev->pci,&fh->pt_vbi);
1339
1340 #ifdef VIDIOC_G_PRIORITY
1341         v4l2_prio_close(&dev->prio,&fh->prio);
1342 #endif
1343         file->private_data = NULL;
1344         kfree(fh);
1345         return 0;
1346 }
1347
1348 static int
1349 video_mmap(struct file *file, struct vm_area_struct * vma)
1350 {
1351         struct saa7134_fh *fh = file->private_data;
1352         
1353         return videobuf_mmap_mapper(vma,saa7134_queue(fh));
1354 }
1355
1356 /* ------------------------------------------------------------------ */
1357
1358 void saa7134_vbi_fmt(struct saa7134_dev *dev, struct v4l2_format *f)
1359 {
1360         struct saa7134_tvnorm *norm = dev->tvnorm;
1361
1362         f->fmt.vbi.sampling_rate = 6750000 * 4;
1363         f->fmt.vbi.samples_per_line = 2048 /* VBI_LINE_LENGTH */;
1364         f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1365         f->fmt.vbi.offset = 64 * 4;
1366         f->fmt.vbi.start[0] = norm->vbi_v_start;
1367         f->fmt.vbi.count[0] = norm->vbi_v_stop - norm->vbi_v_start +1;
1368         f->fmt.vbi.start[1] = norm->video_v_stop + norm->vbi_v_start +1;
1369         f->fmt.vbi.count[1] = f->fmt.vbi.count[0];
1370         f->fmt.vbi.flags = 0; /* VBI_UNSYNC VBI_INTERLACED */
1371
1372 #if 0
1373         if (V4L2_STD_PAL == norm->id) {
1374                 /* FIXME */
1375                 f->fmt.vbi.start[0] += 3;
1376                 f->fmt.vbi.start[1] += 3*2;
1377         }
1378 #endif
1379 }
1380
1381 int saa7134_g_fmt(struct saa7134_dev *dev, struct saa7134_fh *fh,
1382                   struct v4l2_format *f)
1383 {
1384         switch (f->type) {
1385         case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1386                 memset(&f->fmt.pix,0,sizeof(f->fmt.pix));
1387                 f->fmt.pix.width        = fh->width;
1388                 f->fmt.pix.height       = fh->height;
1389                 f->fmt.pix.field        = fh->cap.field;
1390                 f->fmt.pix.pixelformat  = fh->fmt->fourcc;
1391                 f->fmt.pix.bytesperline =
1392                         (f->fmt.pix.width * fh->fmt->depth) >> 3;
1393                 f->fmt.pix.sizeimage =
1394                         f->fmt.pix.height * f->fmt.pix.bytesperline;
1395                 return 0;
1396         case V4L2_BUF_TYPE_VIDEO_OVERLAY:
1397                 f->fmt.win = fh->win;
1398                 return 0;
1399         case V4L2_BUF_TYPE_VBI_CAPTURE:
1400                 saa7134_vbi_fmt(dev,f);
1401                 return 0;
1402         default:
1403                 return -EINVAL;
1404         }
1405 }
1406
1407 int saa7134_try_fmt(struct saa7134_dev *dev, struct saa7134_fh *fh,
1408                     struct v4l2_format *f)
1409 {
1410         int err;
1411         
1412         switch (f->type) {
1413         case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1414         {
1415                 struct saa7134_format *fmt;
1416                 enum v4l2_field field;
1417                 unsigned int maxw, maxh;
1418
1419                 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
1420                 if (NULL == fmt)
1421                         return -EINVAL;
1422
1423                 field = f->fmt.pix.field;
1424                 maxw  = min(dev->crop_current.width*4,  dev->crop_bounds.width);
1425                 maxh  = min(dev->crop_current.height*4, dev->crop_bounds.height);
1426                 
1427                 if (V4L2_FIELD_ANY == field) {
1428                         field = (f->fmt.pix.height > maxh/2)
1429                                 ? V4L2_FIELD_INTERLACED
1430                                 : V4L2_FIELD_BOTTOM;
1431                 }
1432                 switch (field) {
1433                 case V4L2_FIELD_TOP:
1434                 case V4L2_FIELD_BOTTOM:
1435                         maxh = maxh / 2;
1436                         break;
1437                 case V4L2_FIELD_INTERLACED:
1438                         break;
1439                 default:
1440                         return -EINVAL;
1441                 }
1442
1443                 f->fmt.pix.field = field;
1444                 if (f->fmt.pix.width  < 48)
1445                         f->fmt.pix.width  = 48;
1446                 if (f->fmt.pix.height < 32)
1447                         f->fmt.pix.height = 32;
1448                 if (f->fmt.pix.width > maxw)
1449                         f->fmt.pix.width = maxw;
1450                 if (f->fmt.pix.height > maxh)
1451                         f->fmt.pix.height = maxh;
1452                 f->fmt.pix.bytesperline =
1453                         (f->fmt.pix.width * fmt->depth) >> 3;
1454                 f->fmt.pix.sizeimage =
1455                         f->fmt.pix.height * f->fmt.pix.bytesperline;
1456                 
1457                 return 0;
1458         }
1459         case V4L2_BUF_TYPE_VIDEO_OVERLAY:
1460                 err = verify_preview(dev,&f->fmt.win);
1461                 if (0 != err)
1462                         return err;
1463                 return 0;
1464         case V4L2_BUF_TYPE_VBI_CAPTURE:
1465                 saa7134_vbi_fmt(dev,f);
1466                 return 0;
1467         default:
1468                 return -EINVAL;
1469         }
1470 }
1471
1472 int saa7134_s_fmt(struct saa7134_dev *dev, struct saa7134_fh *fh,
1473                   struct v4l2_format *f)
1474 {
1475         unsigned long flags;
1476         int err;
1477         
1478         switch (f->type) {
1479         case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1480                 err = saa7134_try_fmt(dev,fh,f);
1481                 if (0 != err)
1482                         return err;
1483                         
1484                 fh->fmt       = format_by_fourcc(f->fmt.pix.pixelformat);
1485                 fh->width     = f->fmt.pix.width;
1486                 fh->height    = f->fmt.pix.height;
1487                 fh->cap.field = f->fmt.pix.field;
1488                 return 0;
1489         case V4L2_BUF_TYPE_VIDEO_OVERLAY:
1490                 err = verify_preview(dev,&f->fmt.win);
1491                 if (0 != err)
1492                         return err;
1493
1494                 down(&dev->lock);
1495                 fh->win    = f->fmt.win;
1496                 fh->nclips = f->fmt.win.clipcount;
1497                 if (fh->nclips > 8)
1498                         fh->nclips = 8;
1499                 if (copy_from_user(fh->clips,f->fmt.win.clips,
1500                                    sizeof(struct v4l2_clip)*fh->nclips)) {
1501                         up(&dev->lock);
1502                         return -EFAULT;
1503                 }
1504
1505                 if (res_check(fh, RESOURCE_OVERLAY)) {
1506                         spin_lock_irqsave(&dev->slock,flags);
1507                         stop_preview(dev,fh);
1508                         start_preview(dev,fh);
1509                         spin_unlock_irqrestore(&dev->slock,flags);
1510                 }
1511                 up(&dev->lock);
1512                 return 0;
1513         case V4L2_BUF_TYPE_VBI_CAPTURE:
1514                 saa7134_vbi_fmt(dev,f);
1515                 return 0;
1516         default:
1517                 return -EINVAL;
1518         }
1519 }
1520
1521 int saa7134_common_ioctl(struct saa7134_dev *dev,
1522                          unsigned int cmd, void *arg)
1523 {
1524         int err;
1525         
1526         switch (cmd) {
1527         case VIDIOC_QUERYCTRL:
1528         {
1529                 const struct v4l2_queryctrl *ctrl;
1530                 struct v4l2_queryctrl *c = arg;
1531
1532                 if ((c->id <  V4L2_CID_BASE ||
1533                      c->id >= V4L2_CID_LASTP1) &&
1534                     (c->id <  V4L2_CID_PRIVATE_BASE ||
1535                      c->id >= V4L2_CID_PRIVATE_LASTP1))
1536                         return -EINVAL;
1537                 ctrl = ctrl_by_id(c->id);
1538                 *c = (NULL != ctrl) ? *ctrl : no_ctrl;
1539                 return 0;
1540         }
1541         case VIDIOC_G_CTRL:
1542                 return get_control(dev,arg);
1543         case VIDIOC_S_CTRL:
1544         {
1545                 down(&dev->lock);
1546                 err = set_control(dev,NULL,arg);
1547                 up(&dev->lock);
1548                 return err;
1549         }
1550         /* --- input switching --------------------------------------- */
1551         case VIDIOC_ENUMINPUT:
1552         {
1553                 struct v4l2_input *i = arg;
1554                 unsigned int n;
1555
1556                 n = i->index;
1557                 if (n >= SAA7134_INPUT_MAX)
1558                         return -EINVAL;
1559                 if (NULL == card_in(dev,i->index).name)
1560                         return -EINVAL;
1561                 memset(i,0,sizeof(*i));
1562                 i->index = n;
1563                 i->type  = V4L2_INPUT_TYPE_CAMERA;
1564                 strcpy(i->name,card_in(dev,n).name);
1565                 if (card_in(dev,n).tv)
1566                         i->type = V4L2_INPUT_TYPE_TUNER;
1567                 i->audioset = 1;
1568                 if (n == dev->ctl_input) {
1569                         int v1 = saa_readb(SAA7134_STATUS_VIDEO1);
1570                         int v2 = saa_readb(SAA7134_STATUS_VIDEO2);
1571
1572                         if (0 != (v1 & 0x40))
1573                                 i->status |= V4L2_IN_ST_NO_H_LOCK;
1574                         if (0 != (v2 & 0x40))
1575                                 i->status |= V4L2_IN_ST_NO_SYNC;
1576                         if (0 != (v2 & 0x0e))
1577                                 i->status |= V4L2_IN_ST_MACROVISION;
1578                 }
1579                 for (n = 0; n < TVNORMS; n++)
1580                         i->std |= tvnorms[n].id;
1581                 return 0;
1582         }
1583         case VIDIOC_G_INPUT:
1584         {
1585                 int *i = arg;
1586                 *i = dev->ctl_input;
1587                 return 0;
1588         }
1589         case VIDIOC_S_INPUT:
1590         {
1591                 int *i = arg;
1592                 
1593                 if (*i < 0  ||  *i >= SAA7134_INPUT_MAX)
1594                         return -EINVAL;
1595                 if (NULL == card_in(dev,*i).name)
1596                         return -EINVAL;
1597                 down(&dev->lock);
1598                 video_mux(dev,*i);
1599                 up(&dev->lock);
1600                 return 0;
1601         }
1602
1603         }
1604         return 0;
1605 }
1606
1607 /*
1608  * This function is _not_ called directly, but from
1609  * video_generic_ioctl (and maybe others).  userspace
1610  * copying is done already, arg is a kernel pointer.
1611  */
1612 static int video_do_ioctl(struct inode *inode, struct file *file,
1613                           unsigned int cmd, void *arg)
1614 {
1615         struct saa7134_fh *fh = file->private_data;
1616         struct saa7134_dev *dev = fh->dev;
1617         unsigned long flags;
1618         int err;
1619
1620         if (video_debug > 1)
1621                 saa7134_print_ioctl(dev->name,cmd);
1622
1623 #ifdef VIDIOC_G_PRIORITY
1624         switch (cmd) {
1625         case VIDIOC_S_CTRL:
1626         case VIDIOC_S_STD:
1627         case VIDIOC_S_INPUT:
1628         case VIDIOC_S_TUNER:
1629         case VIDIOC_S_FREQUENCY:
1630                 err = v4l2_prio_check(&dev->prio,&fh->prio);
1631                 if (0 != err)
1632                         return err;
1633         }
1634 #endif
1635
1636         switch (cmd) {
1637         case VIDIOC_QUERYCAP:
1638         {
1639                 struct v4l2_capability *cap = arg;
1640                 
1641                 memset(cap,0,sizeof(*cap));
1642                 strcpy(cap->driver, "saa7134");
1643                 strlcpy(cap->card, saa7134_boards[dev->board].name,
1644                         sizeof(cap->card));
1645                 sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci));
1646                 cap->version = SAA7134_VERSION_CODE;
1647                 cap->capabilities =
1648                         V4L2_CAP_VIDEO_CAPTURE |
1649                         V4L2_CAP_VIDEO_OVERLAY |
1650                         V4L2_CAP_VBI_CAPTURE |
1651                         V4L2_CAP_TUNER |
1652                         V4L2_CAP_READWRITE | 
1653                         V4L2_CAP_STREAMING;
1654                 return 0;
1655         }
1656
1657         /* --- tv standards ------------------------------------------ */
1658         case VIDIOC_ENUMSTD:
1659         {
1660                 struct v4l2_standard *e = arg;
1661                 unsigned int i;
1662
1663                 i = e->index;
1664                 if (i >= TVNORMS)
1665                         return -EINVAL;
1666                 err = v4l2_video_std_construct(e, tvnorms[e->index].id,
1667                                                tvnorms[e->index].name);
1668                 e->index = i;
1669                 if (err < 0)
1670                         return err;
1671                 return 0;
1672         }
1673         case VIDIOC_G_STD:
1674         {
1675                 v4l2_std_id *id = arg;
1676
1677                 *id = dev->tvnorm->id;
1678                 return 0;
1679         }
1680         case VIDIOC_S_STD:
1681         {
1682                 v4l2_std_id *id = arg;
1683                 unsigned int i;
1684
1685                 for (i = 0; i < TVNORMS; i++)
1686                         if (*id == tvnorms[i].id)
1687                                 break;
1688                 if (i == TVNORMS)
1689                         for (i = 0; i < TVNORMS; i++)
1690                                 if (*id & tvnorms[i].id)
1691                                         break;
1692                 if (i == TVNORMS)
1693                         return -EINVAL;
1694
1695                 down(&dev->lock);
1696                 if (res_check(fh, RESOURCE_OVERLAY)) {
1697                         spin_lock_irqsave(&dev->slock,flags);
1698                         stop_preview(dev,fh);
1699                         set_tvnorm(dev,&tvnorms[i]);
1700                         start_preview(dev,fh);
1701                         spin_unlock_irqrestore(&dev->slock,flags);
1702                 } else 
1703                         set_tvnorm(dev,&tvnorms[i]);
1704                 saa7134_tvaudio_do_scan(dev);
1705                 up(&dev->lock);
1706                 return 0;
1707         }
1708
1709         case VIDIOC_CROPCAP:
1710         {
1711                 struct v4l2_cropcap *cap = arg;
1712
1713                 if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1714                     cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
1715                         return -EINVAL;
1716                 cap->bounds  = dev->crop_bounds;
1717                 cap->defrect = dev->crop_defrect;
1718                 cap->pixelaspect.numerator   = 1;
1719                 cap->pixelaspect.denominator = 1;
1720                 if (dev->tvnorm->id & V4L2_STD_525_60) {
1721                         cap->pixelaspect.numerator   = 11;
1722                         cap->pixelaspect.denominator = 10;
1723                 }
1724                 if (dev->tvnorm->id & V4L2_STD_625_50) {
1725                         cap->pixelaspect.numerator   = 54;
1726                         cap->pixelaspect.denominator = 59;
1727                 }
1728                 return 0;
1729         }
1730
1731         case VIDIOC_G_CROP:
1732         {
1733                 struct v4l2_crop * crop = arg;
1734
1735                 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1736                     crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
1737                         return -EINVAL;
1738                 crop->c = dev->crop_current;
1739                 return 0;
1740         }
1741         case VIDIOC_S_CROP:
1742         {
1743                 struct v4l2_crop *crop = arg;
1744                 struct v4l2_rect *b = &dev->crop_bounds;
1745
1746                 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1747                     crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
1748                         return -EINVAL;
1749                 if (crop->c.height < 0)
1750                         return -EINVAL;
1751                 if (crop->c.width < 0)
1752                         return -EINVAL;
1753
1754                 if (res_locked(fh->dev,RESOURCE_OVERLAY))
1755                         return -EBUSY;
1756                 if (res_locked(fh->dev,RESOURCE_VIDEO))
1757                         return -EBUSY;
1758
1759                 if (crop->c.top < b->top)
1760                         crop->c.top = b->top;
1761                 if (crop->c.top > b->top + b->height)
1762                         crop->c.top = b->top + b->height;
1763                 if (crop->c.height > b->top - crop->c.top + b->height)
1764                         crop->c.height = b->top - crop->c.top + b->height;
1765
1766                 if (crop->c.left < b->left)
1767                         crop->c.top = b->left;
1768                 if (crop->c.left > b->left + b->width)
1769                         crop->c.top = b->left + b->width;
1770                 if (crop->c.width > b->left - crop->c.left + b->width)
1771                         crop->c.width = b->left - crop->c.left + b->width;
1772
1773                 dev->crop_current = crop->c;
1774                 return 0;
1775         }
1776
1777         /* --- tuner ioctls ------------------------------------------ */
1778         case VIDIOC_G_TUNER:
1779         {
1780                 struct v4l2_tuner *t = arg;
1781                 int n;
1782
1783                 if (0 != t->index)
1784                         return -EINVAL;
1785                 memset(t,0,sizeof(*t));
1786                 for (n = 0; n < SAA7134_INPUT_MAX; n++)
1787                         if (card_in(dev,n).tv)
1788                                 break;
1789                 if (NULL != card_in(dev,n).name) {
1790                         strcpy(t->name, "Television");
1791                         t->capability = V4L2_TUNER_CAP_NORM |
1792                                 V4L2_TUNER_CAP_STEREO |
1793                                 V4L2_TUNER_CAP_LANG1 |
1794                                 V4L2_TUNER_CAP_LANG2;
1795                         t->rangehigh = 0xffffffffUL;
1796                         t->rxsubchans = saa7134_tvaudio_getstereo(dev);
1797                         t->audmode = saa7134_tvaudio_rx2mode(t->rxsubchans);
1798                 }
1799                 if (0 != (saa_readb(SAA7134_STATUS_VIDEO1) & 0x03))
1800                         t->signal = 0xffff;
1801                 return 0;
1802         }
1803         case VIDIOC_S_TUNER:
1804         {
1805                 struct v4l2_tuner *t = arg;
1806                 int rx,mode;
1807
1808                 mode = dev->thread.mode;
1809                 if (UNSET == mode) {
1810                         rx   = saa7134_tvaudio_getstereo(dev);
1811                         mode = saa7134_tvaudio_rx2mode(t->rxsubchans);
1812                 }
1813                 if (mode != t->audmode) {
1814                         dev->thread.mode = t->audmode;
1815                 }
1816                 return 0;
1817         }
1818         case VIDIOC_G_FREQUENCY:
1819         {
1820                 struct v4l2_frequency *f = arg;
1821
1822                 memset(f,0,sizeof(*f));
1823                 f->type = V4L2_TUNER_ANALOG_TV;
1824                 f->frequency = dev->ctl_freq;
1825                 return 0;
1826         }
1827         case VIDIOC_S_FREQUENCY:
1828         {
1829                 struct v4l2_frequency *f = arg;
1830
1831                 if (0 != f->tuner)
1832                         return -EINVAL;
1833                 if (V4L2_TUNER_ANALOG_TV != f->type)
1834                         return -EINVAL;
1835                 down(&dev->lock);
1836                 dev->ctl_freq = f->frequency;
1837 #ifdef V4L2_I2C_CLIENTS
1838                 saa7134_i2c_call_clients(dev,VIDIOC_S_FREQUENCY,f);
1839 #else
1840                 saa7134_i2c_call_clients(dev,VIDIOCSFREQ,&dev->ctl_freq);
1841 #endif
1842                 saa7134_tvaudio_do_scan(dev);
1843                 up(&dev->lock);
1844                 return 0;
1845         }
1846                 
1847         /* --- control ioctls ---------------------------------------- */
1848         case VIDIOC_ENUMINPUT:
1849         case VIDIOC_G_INPUT:
1850         case VIDIOC_S_INPUT:
1851         case VIDIOC_QUERYCTRL:
1852         case VIDIOC_G_CTRL:
1853         case VIDIOC_S_CTRL:
1854                 return saa7134_common_ioctl(dev, cmd, arg);
1855
1856         case VIDIOC_G_AUDIO:
1857         {
1858                 struct v4l2_audio *a = arg;
1859
1860                 memset(a,0,sizeof(*a));
1861                 strcpy(a->name,"audio");
1862                 return 0;
1863         }
1864         case VIDIOC_S_AUDIO:
1865                 return 0;
1866         case VIDIOC_G_PARM:
1867         {
1868                 struct v4l2_captureparm *parm = arg;
1869                 memset(parm,0,sizeof(*parm));
1870                 return 0;
1871         }
1872
1873 #ifdef VIDIOC_G_PRIORITY
1874         case VIDIOC_G_PRIORITY:
1875         {
1876                 enum v4l2_priority *p = arg;
1877
1878                 *p = v4l2_prio_max(&dev->prio);
1879                 return 0;
1880         }
1881         case VIDIOC_S_PRIORITY:
1882         {
1883                 enum v4l2_priority *prio = arg;
1884
1885                 return v4l2_prio_change(&dev->prio, &fh->prio, *prio);
1886         }
1887 #endif
1888
1889         /* --- preview ioctls ---------------------------------------- */
1890         case VIDIOC_ENUM_FMT:
1891         {
1892                 struct v4l2_fmtdesc *f = arg;
1893                 enum v4l2_buf_type type;
1894                 unsigned int index;
1895
1896                 index = f->index;
1897                 type  = f->type;
1898                 switch (type) {
1899                 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1900                 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
1901                         if (index >= FORMATS)
1902                                 return -EINVAL;
1903                         if (f->type == V4L2_BUF_TYPE_VIDEO_OVERLAY &&
1904                             formats[index].planar)
1905                                 return -EINVAL;
1906                         memset(f,0,sizeof(*f));
1907                         f->index = index;
1908                         f->type  = type;
1909                         strlcpy(f->description,formats[index].name,sizeof(f->description));
1910                         f->pixelformat = formats[index].fourcc;
1911                         break;
1912                 case V4L2_BUF_TYPE_VBI_CAPTURE:
1913                         if (0 != index)
1914                                 return -EINVAL;
1915                         memset(f,0,sizeof(*f));
1916                         f->index = index;
1917                         f->type  = type;
1918                         f->pixelformat = V4L2_PIX_FMT_GREY;
1919                         strcpy(f->description,"vbi data");
1920                         break;
1921                 default:
1922                         return -EINVAL; 
1923                 }
1924                 return 0;
1925         }
1926         case VIDIOC_G_FBUF:
1927         {
1928                 struct v4l2_framebuffer *fb = arg;
1929
1930                 *fb = dev->ovbuf;
1931                 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
1932                 return 0;
1933         }
1934         case VIDIOC_S_FBUF:
1935         {
1936                 struct v4l2_framebuffer *fb = arg;
1937                 struct saa7134_format *fmt;
1938                 
1939                 if(!capable(CAP_SYS_ADMIN) &&
1940                    !capable(CAP_SYS_RAWIO))
1941                         return -EPERM;
1942
1943                 /* check args */
1944                 fmt = format_by_fourcc(fb->fmt.pixelformat);
1945                 if (NULL == fmt)
1946                         return -EINVAL;
1947
1948                 /* ok, accept it */
1949                 dev->ovbuf = *fb;
1950                 dev->ovfmt = fmt;
1951                 if (0 == dev->ovbuf.fmt.bytesperline)
1952                         dev->ovbuf.fmt.bytesperline =
1953                                 dev->ovbuf.fmt.width*fmt->depth/8;
1954                 return 0;
1955         }
1956         case VIDIOC_OVERLAY:
1957         {
1958                 int *on = arg;
1959
1960                 if (*on) {
1961                         if (!res_get(dev,fh,RESOURCE_OVERLAY))
1962                                 return -EBUSY;
1963                         spin_lock_irqsave(&dev->slock,flags);
1964                         start_preview(dev,fh);
1965                         spin_unlock_irqrestore(&dev->slock,flags);
1966                 }
1967                 if (!*on) {
1968                         if (!res_check(fh, RESOURCE_OVERLAY))
1969                                 return -EINVAL;
1970                         spin_lock_irqsave(&dev->slock,flags);
1971                         stop_preview(dev,fh);
1972                         spin_unlock_irqrestore(&dev->slock,flags);
1973                         res_free(dev,fh,RESOURCE_OVERLAY);
1974                 }
1975                 return 0;
1976         }
1977
1978         /* --- capture ioctls ---------------------------------------- */
1979         case VIDIOC_G_FMT:
1980         {
1981                 struct v4l2_format *f = arg;
1982                 return saa7134_g_fmt(dev,fh,f);
1983         }
1984         case VIDIOC_S_FMT:
1985         {
1986                 struct v4l2_format *f = arg;
1987                 return saa7134_s_fmt(dev,fh,f);
1988         }
1989         case VIDIOC_TRY_FMT:
1990         {
1991                 struct v4l2_format *f = arg;
1992                 return saa7134_try_fmt(dev,fh,f);
1993         }
1994         
1995         case VIDIOCGMBUF:
1996         {
1997                 struct video_mbuf *mbuf = arg;
1998                 struct videobuf_queue *q;
1999                 struct v4l2_requestbuffers req;
2000                 unsigned int i;
2001
2002                 q = saa7134_queue(fh);
2003                 memset(&req,0,sizeof(req));
2004                 req.type   = q->type;
2005                 req.count  = gbuffers;
2006                 req.memory = V4L2_MEMORY_MMAP;
2007                 err = videobuf_reqbufs(file,q,&req);
2008                 if (err < 0)
2009                         return err;
2010                 memset(mbuf,0,sizeof(*mbuf));
2011                 mbuf->frames = req.count;
2012                 mbuf->size   = 0;
2013                 for (i = 0; i < mbuf->frames; i++) {
2014                         mbuf->offsets[i]  = q->bufs[i]->boff;
2015                         mbuf->size       += q->bufs[i]->bsize;
2016                 }
2017                 return 0;
2018         }
2019         case VIDIOC_REQBUFS:
2020                 return videobuf_reqbufs(file,saa7134_queue(fh),arg);
2021
2022         case VIDIOC_QUERYBUF:
2023                 return videobuf_querybuf(saa7134_queue(fh),arg);
2024
2025         case VIDIOC_QBUF:
2026                 return videobuf_qbuf(file,saa7134_queue(fh),arg);
2027
2028         case VIDIOC_DQBUF:
2029                 return videobuf_dqbuf(file,saa7134_queue(fh),arg);
2030
2031         case VIDIOC_STREAMON:
2032         {
2033                 int res = saa7134_resource(fh);
2034
2035                 if (!res_get(dev,fh,res))
2036                         return -EBUSY;
2037                 return videobuf_streamon(file,saa7134_queue(fh));
2038         }
2039         case VIDIOC_STREAMOFF:
2040         {
2041                 int res = saa7134_resource(fh);
2042
2043                 err = videobuf_streamoff(file,saa7134_queue(fh));
2044                 if (err < 0)
2045                         return err;
2046                 res_free(dev,fh,res);
2047                 return 0;
2048         }
2049
2050         default:
2051                 return v4l_compat_translate_ioctl(inode,file,cmd,arg,
2052                                                   video_do_ioctl);
2053         }
2054         return 0;
2055 }
2056
2057 static int video_ioctl(struct inode *inode, struct file *file,
2058                        unsigned int cmd, unsigned long arg)
2059 {
2060         return video_usercopy(inode, file, cmd, arg, video_do_ioctl);
2061 }
2062
2063 static int radio_do_ioctl(struct inode *inode, struct file *file,
2064                           unsigned int cmd, void *arg)
2065 {
2066         struct saa7134_fh *fh = file->private_data;
2067         struct saa7134_dev *dev = fh->dev;
2068         
2069         if (video_debug > 1)
2070                 saa7134_print_ioctl(dev->name,cmd);
2071         switch (cmd) {
2072         case VIDIOC_QUERYCAP:
2073         {
2074                 struct v4l2_capability *cap = arg;
2075
2076                 memset(cap,0,sizeof(*cap));
2077                 strcpy(cap->driver, "saa7134");
2078                 strlcpy(cap->card, saa7134_boards[dev->board].name,
2079                         sizeof(cap->card));
2080                 sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci));
2081                 cap->version = SAA7134_VERSION_CODE;
2082                 cap->capabilities = V4L2_CAP_TUNER;
2083                 return 0;
2084         }
2085         case VIDIOC_G_TUNER:
2086         {
2087                 struct v4l2_tuner *t = arg;
2088
2089                 if (0 != t->index)
2090                         return -EINVAL;
2091
2092                 memset(t,0,sizeof(*t));
2093                 strcpy(t->name, "Radio");
2094                 t->rangelow  = (int)(65*16);
2095                 t->rangehigh = (int)(108*16);
2096
2097 #ifdef V4L2_I2C_CLIENTS
2098                 saa7134_i2c_call_clients(dev,VIDIOC_G_TUNER,t);
2099 #else
2100                 {
2101                         struct video_tuner vt;
2102                         memset(&vt,0,sizeof(vt));
2103                         saa7134_i2c_call_clients(dev,VIDIOCGTUNER,&vt);
2104                         t->signal = vt.signal;
2105                 }
2106 #endif
2107                 return 0;
2108         }
2109         case VIDIOC_ENUMINPUT:
2110         {
2111                 struct v4l2_input *i = arg;
2112                 
2113                 if (i->index != 0)
2114                         return -EINVAL;
2115                 strcpy(i->name,"Radio");
2116                 i->type = V4L2_INPUT_TYPE_TUNER;
2117                 return 0;
2118         }
2119         case VIDIOC_G_INPUT:
2120         {
2121                 int *i = arg;
2122                 *i = 0;
2123                 return 0;
2124         }
2125         case VIDIOC_G_AUDIO:
2126         {
2127                 struct v4l2_audio *a = arg;
2128
2129                 memset(a,0,sizeof(*a));
2130                 strcpy(a->name,"Radio");
2131                 return 0;
2132         }
2133         case VIDIOC_G_STD:
2134         {
2135                 v4l2_std_id *id = arg;
2136                 *id = 0;
2137                 return 0;
2138         }
2139         case VIDIOC_S_AUDIO:
2140         case VIDIOC_S_TUNER:
2141         case VIDIOC_S_INPUT:
2142         case VIDIOC_S_STD:
2143                 return 0;
2144
2145         case VIDIOC_QUERYCTRL:
2146         {
2147                 const struct v4l2_queryctrl *ctrl;
2148                 struct v4l2_queryctrl *c = arg;
2149
2150                 if (c->id <  V4L2_CID_BASE ||
2151                     c->id >= V4L2_CID_LASTP1)
2152                         return -EINVAL;
2153                 if (c->id == V4L2_CID_AUDIO_MUTE) {
2154                         ctrl = ctrl_by_id(c->id);
2155                         *c = *ctrl;
2156                 } else
2157                         *c = no_ctrl;
2158                 return 0;
2159         }
2160
2161         case VIDIOC_G_CTRL:
2162         case VIDIOC_S_CTRL:
2163         case VIDIOC_G_FREQUENCY:
2164         case VIDIOC_S_FREQUENCY:
2165                 return video_do_ioctl(inode,file,cmd,arg);
2166                 
2167         default:
2168                 return v4l_compat_translate_ioctl(inode,file,cmd,arg,
2169                                                   radio_do_ioctl);
2170         }
2171         return 0;
2172 }
2173
2174 static int radio_ioctl(struct inode *inode, struct file *file,
2175                        unsigned int cmd, unsigned long arg)
2176 {
2177         return video_usercopy(inode, file, cmd, arg, radio_do_ioctl);
2178 }
2179
2180 static struct file_operations video_fops =
2181 {
2182         .owner    = THIS_MODULE,
2183         .open     = video_open,
2184         .release  = video_release,
2185         .read     = video_read,
2186         .poll     = video_poll,
2187         .mmap     = video_mmap,
2188         .ioctl    = video_ioctl,
2189         .llseek   = no_llseek,
2190 };
2191
2192 static struct file_operations radio_fops =
2193 {
2194         .owner    = THIS_MODULE,
2195         .open     = video_open,
2196         .release  = video_release,
2197         .ioctl    = radio_ioctl,
2198         .llseek   = no_llseek,
2199 };
2200
2201 /* ----------------------------------------------------------- */
2202 /* exported stuff                                              */
2203
2204 struct video_device saa7134_video_template =
2205 {
2206         .name          = "saa7134-video",
2207         .type          = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_OVERLAY|
2208                          VID_TYPE_CLIPPING|VID_TYPE_SCALES,
2209         .hardware      = 0,
2210         .fops          = &video_fops,
2211         .minor         = -1,
2212 };
2213
2214 struct video_device saa7134_vbi_template =
2215 {
2216         .name          = "saa7134-vbi",
2217         .type          = VID_TYPE_TUNER|VID_TYPE_TELETEXT,
2218         .hardware      = 0,
2219         .fops          = &video_fops,
2220         .minor         = -1,
2221 };
2222
2223 struct video_device saa7134_radio_template =
2224 {
2225         .name          = "saa7134-radio",
2226         .type          = VID_TYPE_TUNER,
2227         .hardware      = 0,
2228         .fops          = &radio_fops,
2229         .minor         = -1,
2230 };
2231
2232 int saa7134_video_init1(struct saa7134_dev *dev)
2233 {
2234         /* sanitycheck insmod options */
2235         if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
2236                 gbuffers = 2;
2237         if (gbufsize < 0 || gbufsize > gbufsize_max)
2238                 gbufsize = gbufsize_max;
2239         gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK;
2240
2241         /* put some sensible defaults into the data structures ... */
2242         dev->ctl_bright     = ctrl_by_id(V4L2_CID_BRIGHTNESS)->default_value;
2243         dev->ctl_contrast   = ctrl_by_id(V4L2_CID_CONTRAST)->default_value;
2244         dev->ctl_hue        = ctrl_by_id(V4L2_CID_HUE)->default_value;
2245         dev->ctl_saturation = ctrl_by_id(V4L2_CID_SATURATION)->default_value;
2246         dev->ctl_volume     = ctrl_by_id(V4L2_CID_AUDIO_VOLUME)->default_value;
2247
2248         dev->ctl_invert     = 0;
2249         dev->ctl_mute       = 1;
2250         dev->automute       = 0;
2251
2252         INIT_LIST_HEAD(&dev->video_q.queue);
2253         init_timer(&dev->video_q.timeout);
2254         dev->video_q.timeout.function = saa7134_buffer_timeout;
2255         dev->video_q.timeout.data     = (unsigned long)(&dev->video_q);
2256         dev->video_q.dev              = dev;
2257
2258         if (saa7134_boards[dev->board].video_out) {
2259                 /* enable video output */
2260                 int vo = saa7134_boards[dev->board].video_out;
2261                 saa_writeb(SAA7134_VIDEO_PORT_CTRL0, video_out[vo][0]);
2262                 saa_writeb(SAA7134_VIDEO_PORT_CTRL1, video_out[vo][1]);
2263                 saa_writeb(SAA7134_VIDEO_PORT_CTRL2, video_out[vo][2]);
2264                 saa_writeb(SAA7134_VIDEO_PORT_CTRL3, video_out[vo][3]);
2265                 saa_writeb(SAA7134_VIDEO_PORT_CTRL4, video_out[vo][4]);
2266                 saa_writeb(SAA7134_VIDEO_PORT_CTRL5, video_out[vo][5]);
2267                 saa_writeb(SAA7134_VIDEO_PORT_CTRL6, video_out[vo][6]);
2268                 saa_writeb(SAA7134_VIDEO_PORT_CTRL7, video_out[vo][7]);
2269                 saa_writeb(SAA7134_VIDEO_PORT_CTRL8, video_out[vo][8]);
2270         }
2271  
2272         return 0;
2273 }
2274
2275 int saa7134_video_init2(struct saa7134_dev *dev)
2276 {
2277         /* init video hw */
2278         set_tvnorm(dev,&tvnorms[0]);
2279         video_mux(dev,0);
2280         saa7134_tvaudio_setmute(dev);
2281         saa7134_tvaudio_setvolume(dev,dev->ctl_volume);
2282         return 0;
2283 }
2284
2285 int saa7134_video_fini(struct saa7134_dev *dev)
2286 {
2287         /* nothing */
2288         return 0;
2289 }
2290
2291 void saa7134_irq_video_intl(struct saa7134_dev *dev)
2292 {
2293         static const char *st[] = {
2294                 "no signal", "found NTSC", "found PAL", "found SECAM" };
2295         int norm;
2296
2297         norm = saa_readb(SAA7134_STATUS_VIDEO1) & 0x03;
2298         dprintk("DCSDT: %s\n",st[norm]);
2299         
2300         if (0 != norm) {
2301                 /* wake up tvaudio audio carrier scan thread */
2302                 saa7134_tvaudio_do_scan(dev);
2303         } else {
2304                 /* no video signal -> mute audio */
2305                 dev->automute = 1;
2306                 saa7134_tvaudio_setmute(dev);
2307         }
2308 }
2309
2310 void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status)
2311 {
2312         enum v4l2_field field;
2313         
2314         spin_lock(&dev->slock);
2315         if (dev->video_q.curr) {
2316                 dev->video_fieldcount++;
2317                 field = dev->video_q.curr->vb.field;
2318                 if (V4L2_FIELD_HAS_BOTH(field)) {
2319                         /* make sure we have seen both fields */
2320                         if ((status & 0x10) == 0x00) {
2321                                 dev->video_q.curr->top_seen = 1;
2322                                 goto done;
2323                         }
2324                         if (!dev->video_q.curr->top_seen)
2325                                 goto done;
2326                 } else if (field == V4L2_FIELD_TOP) {
2327                         if ((status & 0x10) != 0x10)
2328                                 goto done;
2329                 } else if (field == V4L2_FIELD_BOTTOM) {
2330                         if ((status & 0x10) != 0x00)
2331                                 goto done;
2332                 }
2333                 dev->video_q.curr->vb.field_count = dev->video_fieldcount;
2334                 saa7134_buffer_finish(dev,&dev->video_q,STATE_DONE);
2335         }
2336         saa7134_buffer_next(dev,&dev->video_q);
2337
2338  done:
2339         spin_unlock(&dev->slock);
2340 }
2341
2342 /* ----------------------------------------------------------- */
2343 /*
2344  * Local variables:
2345  * c-basic-offset: 8
2346  * End:
2347  */