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