OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [media/] [video/] [vino.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * Driver for the VINO (Video In No Out) system found in SGI Indys.
3
 *
4
 * This file is subject to the terms and conditions of the GNU General Public
5
 * License version 2 as published by the Free Software Foundation.
6
 *
7
 * Copyright (C) 2004,2005 Mikael Nousiainen <tmnousia@cc.hut.fi>
8
 *
9
 * Based on the previous version of the driver for 2.4 kernels by:
10
 * Copyright (C) 2003 Ladislav Michl <ladis@linux-mips.org>
11
 */
12
 
13
/*
14
 * TODO:
15
 * - remove "mark pages reserved-hacks" from memory allocation code
16
 *   and implement nopage()
17
 * - check decimation, calculating and reporting image size when
18
 *   using decimation
19
 * - implement read(), user mode buffers and overlay (?)
20
 */
21
 
22
#include <linux/init.h>
23
#include <linux/module.h>
24
#include <linux/delay.h>
25
#include <linux/dma-mapping.h>
26
#include <linux/errno.h>
27
#include <linux/fs.h>
28
#include <linux/interrupt.h>
29
#include <linux/kernel.h>
30
#include <linux/mm.h>
31
#include <linux/time.h>
32
#include <linux/version.h>
33
 
34
#ifdef CONFIG_KMOD
35
#include <linux/kmod.h>
36
#endif
37
 
38
#include <linux/i2c.h>
39
#include <linux/i2c-algo-sgi.h>
40
 
41
#include <linux/videodev.h>
42
#include <media/v4l2-common.h>
43
#include <linux/video_decoder.h>
44
#include <linux/mutex.h>
45
 
46
#include <asm/paccess.h>
47
#include <asm/io.h>
48
#include <asm/sgi/ip22.h>
49
#include <asm/sgi/mc.h>
50
 
51
#include "vino.h"
52
#include "saa7191.h"
53
#include "indycam.h"
54
 
55
/* Uncomment the following line to get lots and lots of (mostly useless)
56
 * debug info.
57
 * Note that the debug output also slows down the driver significantly */
58
// #define VINO_DEBUG
59
// #define VINO_DEBUG_INT
60
 
61
#define VINO_MODULE_VERSION "0.0.5"
62
#define VINO_VERSION_CODE KERNEL_VERSION(0, 0, 5)
63
 
64
MODULE_DESCRIPTION("SGI VINO Video4Linux2 driver");
65
MODULE_VERSION(VINO_MODULE_VERSION);
66
MODULE_AUTHOR("Mikael Nousiainen <tmnousia@cc.hut.fi>");
67
MODULE_LICENSE("GPL");
68
 
69
#ifdef VINO_DEBUG
70
#define dprintk(x...) printk("VINO: " x);
71
#else
72
#define dprintk(x...)
73
#endif
74
 
75
#define VINO_NO_CHANNEL                 0
76
#define VINO_CHANNEL_A                  1
77
#define VINO_CHANNEL_B                  2
78
 
79
#define VINO_PAL_WIDTH                  768
80
#define VINO_PAL_HEIGHT                 576
81
#define VINO_NTSC_WIDTH                 640
82
#define VINO_NTSC_HEIGHT                480
83
 
84
#define VINO_MIN_WIDTH                  32
85
#define VINO_MIN_HEIGHT                 32
86
 
87
#define VINO_CLIPPING_START_ODD_D1      1
88
#define VINO_CLIPPING_START_ODD_PAL     15
89
#define VINO_CLIPPING_START_ODD_NTSC    12
90
 
91
#define VINO_CLIPPING_START_EVEN_D1     2
92
#define VINO_CLIPPING_START_EVEN_PAL    15
93
#define VINO_CLIPPING_START_EVEN_NTSC   12
94
 
95
#define VINO_INPUT_CHANNEL_COUNT        3
96
 
97
/* the number is the index for vino_inputs */
98
#define VINO_INPUT_NONE                 -1
99
#define VINO_INPUT_COMPOSITE            0
100
#define VINO_INPUT_SVIDEO               1
101
#define VINO_INPUT_D1                   2
102
 
103
#define VINO_PAGE_RATIO                 (PAGE_SIZE / VINO_PAGE_SIZE)
104
 
105
#define VINO_FIFO_THRESHOLD_DEFAULT     16
106
 
107
#define VINO_FRAMEBUFFER_SIZE           ((VINO_PAL_WIDTH \
108
                                          * VINO_PAL_HEIGHT * 4 \
109
                                          + 3 * PAGE_SIZE) & ~(PAGE_SIZE - 1))
110
 
111
#define VINO_FRAMEBUFFER_COUNT_MAX      8
112
 
113
#define VINO_FRAMEBUFFER_UNUSED         0
114
#define VINO_FRAMEBUFFER_IN_USE         1
115
#define VINO_FRAMEBUFFER_READY          2
116
 
117
#define VINO_QUEUE_ERROR                -1
118
#define VINO_QUEUE_MAGIC                0x20050125
119
 
120
#define VINO_MEMORY_NONE                0
121
#define VINO_MEMORY_MMAP                1
122
#define VINO_MEMORY_USERPTR             2
123
 
124
#define VINO_DUMMY_DESC_COUNT           4
125
#define VINO_DESC_FETCH_DELAY           5       /* microseconds */
126
 
127
#define VINO_MAX_FRAME_SKIP_COUNT       128
128
 
129
/* the number is the index for vino_data_formats */
130
#define VINO_DATA_FMT_NONE              -1
131
#define VINO_DATA_FMT_GREY              0
132
#define VINO_DATA_FMT_RGB332            1
133
#define VINO_DATA_FMT_RGB32             2
134
#define VINO_DATA_FMT_YUV               3
135
 
136
#define VINO_DATA_FMT_COUNT             4
137
 
138
/* the number is the index for vino_data_norms */
139
#define VINO_DATA_NORM_NONE             -1
140
#define VINO_DATA_NORM_NTSC             0
141
#define VINO_DATA_NORM_PAL              1
142
#define VINO_DATA_NORM_SECAM            2
143
#define VINO_DATA_NORM_D1               3
144
/* The following are special entries that can be used to
145
 * autodetect the norm. */
146
#define VINO_DATA_NORM_AUTO             0xfe
147
#define VINO_DATA_NORM_AUTO_EXT         0xff
148
 
149
#define VINO_DATA_NORM_COUNT            4
150
 
151
/* Internal data structure definitions */
152
 
153
struct vino_input {
154
        char *name;
155
        v4l2_std_id std;
156
};
157
 
158
struct vino_clipping {
159
        unsigned int left, right, top, bottom;
160
};
161
 
162
struct vino_data_format {
163
        /* the description */
164
        char *description;
165
        /* bytes per pixel */
166
        unsigned int bpp;
167
        /* V4L2 fourcc code */
168
        __u32 pixelformat;
169
        /* V4L2 colorspace (duh!) */
170
        enum v4l2_colorspace colorspace;
171
};
172
 
173
struct vino_data_norm {
174
        char *description;
175
        unsigned int width, height;
176
        struct vino_clipping odd;
177
        struct vino_clipping even;
178
 
179
        v4l2_std_id std;
180
        unsigned int fps_min, fps_max;
181
        __u32 framelines;
182
};
183
 
184
struct vino_descriptor_table {
185
        /* the number of PAGE_SIZE sized pages in the buffer */
186
        unsigned int page_count;
187
        /* virtual (kmalloc'd) pointers to the actual data
188
         * (in PAGE_SIZE chunks, used with mmap streaming) */
189
        unsigned long *virtual;
190
 
191
        /* cpu address for the VINO descriptor table
192
         * (contains DMA addresses, VINO_PAGE_SIZE chunks) */
193
        unsigned long *dma_cpu;
194
        /* dma address for the VINO descriptor table
195
         * (contains DMA addresses, VINO_PAGE_SIZE chunks) */
196
        dma_addr_t dma;
197
};
198
 
199
struct vino_framebuffer {
200
        /* identifier nubmer */
201
        unsigned int id;
202
        /* the length of the whole buffer */
203
        unsigned int size;
204
        /* the length of actual data in buffer */
205
        unsigned int data_size;
206
        /* the data format */
207
        unsigned int data_format;
208
        /* the state of buffer data */
209
        unsigned int state;
210
        /* is the buffer mapped in user space? */
211
        unsigned int map_count;
212
        /* memory offset for mmap() */
213
        unsigned int offset;
214
        /* frame counter */
215
        unsigned int frame_counter;
216
        /* timestamp (written when image capture finishes) */
217
        struct timeval timestamp;
218
 
219
        struct vino_descriptor_table desc_table;
220
 
221
        spinlock_t state_lock;
222
};
223
 
224
struct vino_framebuffer_fifo {
225
        unsigned int length;
226
 
227
        unsigned int used;
228
        unsigned int head;
229
        unsigned int tail;
230
 
231
        unsigned int data[VINO_FRAMEBUFFER_COUNT_MAX];
232
};
233
 
234
struct vino_framebuffer_queue {
235
        unsigned int magic;
236
 
237
        /* VINO_MEMORY_NONE, VINO_MEMORY_MMAP or VINO_MEMORY_USERPTR */
238
        unsigned int type;
239
        unsigned int length;
240
 
241
        /* data field of in and out contain index numbers for buffer */
242
        struct vino_framebuffer_fifo in;
243
        struct vino_framebuffer_fifo out;
244
 
245
        struct vino_framebuffer *buffer[VINO_FRAMEBUFFER_COUNT_MAX];
246
 
247
        spinlock_t queue_lock;
248
        struct mutex queue_mutex;
249
        wait_queue_head_t frame_wait_queue;
250
};
251
 
252
struct vino_interrupt_data {
253
        struct timeval timestamp;
254
        unsigned int frame_counter;
255
        unsigned int skip_count;
256
        unsigned int skip;
257
};
258
 
259
struct vino_channel_settings {
260
        unsigned int channel;
261
 
262
        int input;
263
        unsigned int data_format;
264
        unsigned int data_norm;
265
        struct vino_clipping clipping;
266
        unsigned int decimation;
267
        unsigned int line_size;
268
        unsigned int alpha;
269
        unsigned int fps;
270
        unsigned int framert_reg;
271
 
272
        unsigned int fifo_threshold;
273
 
274
        struct vino_framebuffer_queue fb_queue;
275
 
276
        /* number of the current field */
277
        unsigned int field;
278
 
279
        /* read in progress */
280
        int reading;
281
        /* streaming is active */
282
        int streaming;
283
        /* the driver is currently processing the queue */
284
        int capturing;
285
 
286
        struct mutex mutex;
287
        spinlock_t capture_lock;
288
 
289
        unsigned int users;
290
 
291
        struct vino_interrupt_data int_data;
292
 
293
        /* V4L support */
294
        struct video_device *v4l_device;
295
};
296
 
297
struct vino_client {
298
        /* the channel which owns this client:
299
         * VINO_NO_CHANNEL, VINO_CHANNEL_A or VINO_CHANNEL_B */
300
        unsigned int owner;
301
        struct i2c_client *driver;
302
};
303
 
304
struct vino_settings {
305
        struct vino_channel_settings a;
306
        struct vino_channel_settings b;
307
 
308
        struct vino_client decoder;
309
        struct vino_client camera;
310
 
311
        /* a lock for vino register access */
312
        spinlock_t vino_lock;
313
        /* a lock for channel input changes */
314
        spinlock_t input_lock;
315
 
316
        unsigned long dummy_page;
317
        struct vino_descriptor_table dummy_desc_table;
318
};
319
 
320
/* Module parameters */
321
 
322
/*
323
 * Using vino_pixel_conversion the ABGR32-format pixels supplied
324
 * by the VINO chip can be converted to more common formats
325
 * like RGBA32 (or probably RGB24 in the future). This way we
326
 * can give out data that can be specified correctly with
327
 * the V4L2-definitions.
328
 *
329
 * The pixel format is specified as RGBA32 when no conversion
330
 * is used.
331
 *
332
 * Note that this only affects the 32-bit bit depth.
333
 *
334
 * Use non-zero value to enable conversion.
335
 */
336
static int vino_pixel_conversion = 0;
337
 
338
module_param_named(pixelconv, vino_pixel_conversion, int, 0);
339
 
340
MODULE_PARM_DESC(pixelconv,
341
                 "enable pixel conversion (non-zero value enables)");
342
 
343
/* Internal data structures */
344
 
345
static struct sgi_vino *vino;
346
 
347
static struct vino_settings *vino_drvdata;
348
 
349
static const char *vino_driver_name = "vino";
350
static const char *vino_driver_description = "SGI VINO";
351
static const char *vino_bus_name = "GIO64 bus";
352
static const char *vino_v4l_device_name_a = "SGI VINO Channel A";
353
static const char *vino_v4l_device_name_b = "SGI VINO Channel B";
354
 
355
static void vino_capture_tasklet(unsigned long channel);
356
 
357
DECLARE_TASKLET(vino_tasklet_a, vino_capture_tasklet, VINO_CHANNEL_A);
358
DECLARE_TASKLET(vino_tasklet_b, vino_capture_tasklet, VINO_CHANNEL_B);
359
 
360
static const struct vino_input vino_inputs[] = {
361
        {
362
                .name           = "Composite",
363
                .std            = V4L2_STD_NTSC | V4L2_STD_PAL
364
                | V4L2_STD_SECAM,
365
        },{
366
                .name           = "S-Video",
367
                .std            = V4L2_STD_NTSC | V4L2_STD_PAL
368
                | V4L2_STD_SECAM,
369
        },{
370
                .name           = "D1/IndyCam",
371
                .std            = V4L2_STD_NTSC,
372
        }
373
};
374
 
375
static const struct vino_data_format vino_data_formats[] = {
376
        {
377
                .description    = "8-bit greyscale",
378
                .bpp            = 1,
379
                .pixelformat    = V4L2_PIX_FMT_GREY,
380
                .colorspace     = V4L2_COLORSPACE_SMPTE170M,
381
        },{
382
                .description    = "8-bit dithered RGB 3-3-2",
383
                .bpp            = 1,
384
                .pixelformat    = V4L2_PIX_FMT_RGB332,
385
                .colorspace     = V4L2_COLORSPACE_SRGB,
386
        },{
387
                .description    = "32-bit RGB",
388
                .bpp            = 4,
389
                .pixelformat    = V4L2_PIX_FMT_RGB32,
390
                .colorspace     = V4L2_COLORSPACE_SRGB,
391
        },{
392
                .description    = "YUV 4:2:2",
393
                .bpp            = 2,
394
                .pixelformat    = V4L2_PIX_FMT_YUYV, // XXX: swapped?
395
                .colorspace     = V4L2_COLORSPACE_SMPTE170M,
396
        }
397
};
398
 
399
static const struct vino_data_norm vino_data_norms[] = {
400
        {
401
                .description    = "NTSC",
402
                .std            = V4L2_STD_NTSC,
403
                .fps_min        = 6,
404
                .fps_max        = 30,
405
                .framelines     = 525,
406
                .width          = VINO_NTSC_WIDTH,
407
                .height         = VINO_NTSC_HEIGHT,
408
                .odd            = {
409
                        .top    = VINO_CLIPPING_START_ODD_NTSC,
410
                        .left   = 0,
411
                        .bottom = VINO_CLIPPING_START_ODD_NTSC
412
                        + VINO_NTSC_HEIGHT / 2 - 1,
413
                        .right  = VINO_NTSC_WIDTH,
414
                },
415
                .even           = {
416
                        .top    = VINO_CLIPPING_START_EVEN_NTSC,
417
                        .left   = 0,
418
                        .bottom = VINO_CLIPPING_START_EVEN_NTSC
419
                        + VINO_NTSC_HEIGHT / 2 - 1,
420
                        .right  = VINO_NTSC_WIDTH,
421
                },
422
        },{
423
                .description    = "PAL",
424
                .std            = V4L2_STD_PAL,
425
                .fps_min        = 5,
426
                .fps_max        = 25,
427
                .framelines     = 625,
428
                .width          = VINO_PAL_WIDTH,
429
                .height         = VINO_PAL_HEIGHT,
430
                .odd            = {
431
                        .top    = VINO_CLIPPING_START_ODD_PAL,
432
                        .left   = 0,
433
                        .bottom = VINO_CLIPPING_START_ODD_PAL
434
                        + VINO_PAL_HEIGHT / 2 - 1,
435
                        .right  = VINO_PAL_WIDTH,
436
                },
437
                .even           = {
438
                        .top    = VINO_CLIPPING_START_EVEN_PAL,
439
                        .left   = 0,
440
                        .bottom = VINO_CLIPPING_START_EVEN_PAL
441
                        + VINO_PAL_HEIGHT / 2 - 1,
442
                        .right  = VINO_PAL_WIDTH,
443
                },
444
        },{
445
                .description    = "SECAM",
446
                .std            = V4L2_STD_SECAM,
447
                .fps_min        = 5,
448
                .fps_max        = 25,
449
                .framelines     = 625,
450
                .width          = VINO_PAL_WIDTH,
451
                .height         = VINO_PAL_HEIGHT,
452
                .odd            = {
453
                        .top    = VINO_CLIPPING_START_ODD_PAL,
454
                        .left   = 0,
455
                        .bottom = VINO_CLIPPING_START_ODD_PAL
456
                        + VINO_PAL_HEIGHT / 2 - 1,
457
                        .right  = VINO_PAL_WIDTH,
458
                },
459
                .even           = {
460
                        .top    = VINO_CLIPPING_START_EVEN_PAL,
461
                        .left   = 0,
462
                        .bottom = VINO_CLIPPING_START_EVEN_PAL
463
                        + VINO_PAL_HEIGHT / 2 - 1,
464
                        .right  = VINO_PAL_WIDTH,
465
                },
466
        },{
467
                .description    = "NTSC/D1",
468
                .std            = V4L2_STD_NTSC,
469
                .fps_min        = 6,
470
                .fps_max        = 30,
471
                .framelines     = 525,
472
                .width          = VINO_NTSC_WIDTH,
473
                .height         = VINO_NTSC_HEIGHT,
474
                .odd            = {
475
                        .top    = VINO_CLIPPING_START_ODD_D1,
476
                        .left   = 0,
477
                        .bottom = VINO_CLIPPING_START_ODD_D1
478
                        + VINO_NTSC_HEIGHT / 2 - 1,
479
                        .right  = VINO_NTSC_WIDTH,
480
                },
481
                .even           = {
482
                        .top    = VINO_CLIPPING_START_EVEN_D1,
483
                        .left   = 0,
484
                        .bottom = VINO_CLIPPING_START_EVEN_D1
485
                        + VINO_NTSC_HEIGHT / 2 - 1,
486
                        .right  = VINO_NTSC_WIDTH,
487
                },
488
        }
489
};
490
 
491
#define VINO_INDYCAM_V4L2_CONTROL_COUNT         9
492
 
493
struct v4l2_queryctrl vino_indycam_v4l2_controls[] = {
494
        {
495
                .id = V4L2_CID_AUTOGAIN,
496
                .type = V4L2_CTRL_TYPE_BOOLEAN,
497
                .name = "Automatic Gain Control",
498
                .minimum = 0,
499
                .maximum = 1,
500
                .step = 1,
501
                .default_value = INDYCAM_AGC_DEFAULT,
502
                .flags = 0,
503
                .reserved = { INDYCAM_CONTROL_AGC, 0 },
504
        },{
505
                .id = V4L2_CID_AUTO_WHITE_BALANCE,
506
                .type = V4L2_CTRL_TYPE_BOOLEAN,
507
                .name = "Automatic White Balance",
508
                .minimum = 0,
509
                .maximum = 1,
510
                .step = 1,
511
                .default_value = INDYCAM_AWB_DEFAULT,
512
                .flags = 0,
513
                .reserved = { INDYCAM_CONTROL_AWB, 0 },
514
        },{
515
                .id = V4L2_CID_GAIN,
516
                .type = V4L2_CTRL_TYPE_INTEGER,
517
                .name = "Gain",
518
                .minimum = INDYCAM_GAIN_MIN,
519
                .maximum = INDYCAM_GAIN_MAX,
520
                .step = 1,
521
                .default_value = INDYCAM_GAIN_DEFAULT,
522
                .flags = 0,
523
                .reserved = { INDYCAM_CONTROL_GAIN, 0 },
524
        },{
525
                .id = V4L2_CID_PRIVATE_BASE,
526
                .type = V4L2_CTRL_TYPE_INTEGER,
527
                .name = "Red Saturation",
528
                .minimum = INDYCAM_RED_SATURATION_MIN,
529
                .maximum = INDYCAM_RED_SATURATION_MAX,
530
                .step = 1,
531
                .default_value = INDYCAM_RED_SATURATION_DEFAULT,
532
                .flags = 0,
533
                .reserved = { INDYCAM_CONTROL_RED_SATURATION, 0 },
534
        },{
535
                .id = V4L2_CID_PRIVATE_BASE + 1,
536
                .type = V4L2_CTRL_TYPE_INTEGER,
537
                .name = "Blue Saturation",
538
                .minimum = INDYCAM_BLUE_SATURATION_MIN,
539
                .maximum = INDYCAM_BLUE_SATURATION_MAX,
540
                .step = 1,
541
                .default_value = INDYCAM_BLUE_SATURATION_DEFAULT,
542
                .flags = 0,
543
                .reserved = { INDYCAM_CONTROL_BLUE_SATURATION, 0 },
544
        },{
545
                .id = V4L2_CID_RED_BALANCE,
546
                .type = V4L2_CTRL_TYPE_INTEGER,
547
                .name = "Red Balance",
548
                .minimum = INDYCAM_RED_BALANCE_MIN,
549
                .maximum = INDYCAM_RED_BALANCE_MAX,
550
                .step = 1,
551
                .default_value = INDYCAM_RED_BALANCE_DEFAULT,
552
                .flags = 0,
553
                .reserved = { INDYCAM_CONTROL_RED_BALANCE, 0 },
554
        },{
555
                .id = V4L2_CID_BLUE_BALANCE,
556
                .type = V4L2_CTRL_TYPE_INTEGER,
557
                .name = "Blue Balance",
558
                .minimum = INDYCAM_BLUE_BALANCE_MIN,
559
                .maximum = INDYCAM_BLUE_BALANCE_MAX,
560
                .step = 1,
561
                .default_value = INDYCAM_BLUE_BALANCE_DEFAULT,
562
                .flags = 0,
563
                .reserved = { INDYCAM_CONTROL_BLUE_BALANCE, 0 },
564
        },{
565
                .id = V4L2_CID_EXPOSURE,
566
                .type = V4L2_CTRL_TYPE_INTEGER,
567
                .name = "Shutter Control",
568
                .minimum = INDYCAM_SHUTTER_MIN,
569
                .maximum = INDYCAM_SHUTTER_MAX,
570
                .step = 1,
571
                .default_value = INDYCAM_SHUTTER_DEFAULT,
572
                .flags = 0,
573
                .reserved = { INDYCAM_CONTROL_SHUTTER, 0 },
574
        },{
575
                .id = V4L2_CID_GAMMA,
576
                .type = V4L2_CTRL_TYPE_INTEGER,
577
                .name = "Gamma",
578
                .minimum = INDYCAM_GAMMA_MIN,
579
                .maximum = INDYCAM_GAMMA_MAX,
580
                .step = 1,
581
                .default_value = INDYCAM_GAMMA_DEFAULT,
582
                .flags = 0,
583
                .reserved = { INDYCAM_CONTROL_GAMMA, 0 },
584
        }
585
};
586
 
587
#define VINO_SAA7191_V4L2_CONTROL_COUNT         9
588
 
589
struct v4l2_queryctrl vino_saa7191_v4l2_controls[] = {
590
        {
591
                .id = V4L2_CID_HUE,
592
                .type = V4L2_CTRL_TYPE_INTEGER,
593
                .name = "Hue",
594
                .minimum = SAA7191_HUE_MIN,
595
                .maximum = SAA7191_HUE_MAX,
596
                .step = 1,
597
                .default_value = SAA7191_HUE_DEFAULT,
598
                .flags = 0,
599
                .reserved = { SAA7191_CONTROL_HUE, 0 },
600
        },{
601
                .id = V4L2_CID_PRIVATE_BASE,
602
                .type = V4L2_CTRL_TYPE_INTEGER,
603
                .name = "Luminance Bandpass",
604
                .minimum = SAA7191_BANDPASS_MIN,
605
                .maximum = SAA7191_BANDPASS_MAX,
606
                .step = 1,
607
                .default_value = SAA7191_BANDPASS_DEFAULT,
608
                .flags = 0,
609
                .reserved = { SAA7191_CONTROL_BANDPASS, 0 },
610
        },{
611
                .id = V4L2_CID_PRIVATE_BASE + 1,
612
                .type = V4L2_CTRL_TYPE_INTEGER,
613
                .name = "Luminance Bandpass Weight",
614
                .minimum = SAA7191_BANDPASS_WEIGHT_MIN,
615
                .maximum = SAA7191_BANDPASS_WEIGHT_MAX,
616
                .step = 1,
617
                .default_value = SAA7191_BANDPASS_WEIGHT_DEFAULT,
618
                .flags = 0,
619
                .reserved = { SAA7191_CONTROL_BANDPASS_WEIGHT, 0 },
620
        },{
621
                .id = V4L2_CID_PRIVATE_BASE + 2,
622
                .type = V4L2_CTRL_TYPE_INTEGER,
623
                .name = "HF Luminance Coring",
624
                .minimum = SAA7191_CORING_MIN,
625
                .maximum = SAA7191_CORING_MAX,
626
                .step = 1,
627
                .default_value = SAA7191_CORING_DEFAULT,
628
                .flags = 0,
629
                .reserved = { SAA7191_CONTROL_CORING, 0 },
630
        },{
631
                .id = V4L2_CID_PRIVATE_BASE + 3,
632
                .type = V4L2_CTRL_TYPE_BOOLEAN,
633
                .name = "Force Colour",
634
                .minimum = SAA7191_FORCE_COLOUR_MIN,
635
                .maximum = SAA7191_FORCE_COLOUR_MAX,
636
                .step = 1,
637
                .default_value = SAA7191_FORCE_COLOUR_DEFAULT,
638
                .flags = 0,
639
                .reserved = { SAA7191_CONTROL_FORCE_COLOUR, 0 },
640
        },{
641
                .id = V4L2_CID_PRIVATE_BASE + 4,
642
                .type = V4L2_CTRL_TYPE_INTEGER,
643
                .name = "Chrominance Gain Control",
644
                .minimum = SAA7191_CHROMA_GAIN_MIN,
645
                .maximum = SAA7191_CHROMA_GAIN_MAX,
646
                .step = 1,
647
                .default_value = SAA7191_CHROMA_GAIN_DEFAULT,
648
                .flags = 0,
649
                .reserved = { SAA7191_CONTROL_CHROMA_GAIN, 0 },
650
        },{
651
                .id = V4L2_CID_PRIVATE_BASE + 5,
652
                .type = V4L2_CTRL_TYPE_BOOLEAN,
653
                .name = "VTR Time Constant",
654
                .minimum = SAA7191_VTRC_MIN,
655
                .maximum = SAA7191_VTRC_MAX,
656
                .step = 1,
657
                .default_value = SAA7191_VTRC_DEFAULT,
658
                .flags = 0,
659
                .reserved = { SAA7191_CONTROL_VTRC, 0 },
660
        },{
661
                .id = V4L2_CID_PRIVATE_BASE + 6,
662
                .type = V4L2_CTRL_TYPE_INTEGER,
663
                .name = "Luminance Delay Compensation",
664
                .minimum = SAA7191_LUMA_DELAY_MIN,
665
                .maximum = SAA7191_LUMA_DELAY_MAX,
666
                .step = 1,
667
                .default_value = SAA7191_LUMA_DELAY_DEFAULT,
668
                .flags = 0,
669
                .reserved = { SAA7191_CONTROL_LUMA_DELAY, 0 },
670
        },{
671
                .id = V4L2_CID_PRIVATE_BASE + 7,
672
                .type = V4L2_CTRL_TYPE_INTEGER,
673
                .name = "Vertical Noise Reduction",
674
                .minimum = SAA7191_VNR_MIN,
675
                .maximum = SAA7191_VNR_MAX,
676
                .step = 1,
677
                .default_value = SAA7191_VNR_DEFAULT,
678
                .flags = 0,
679
                .reserved = { SAA7191_CONTROL_VNR, 0 },
680
        }
681
};
682
 
683
/* VINO I2C bus functions */
684
 
685
unsigned i2c_vino_getctrl(void *data)
686
{
687
        return vino->i2c_control;
688
}
689
 
690
void i2c_vino_setctrl(void *data, unsigned val)
691
{
692
        vino->i2c_control = val;
693
}
694
 
695
unsigned i2c_vino_rdata(void *data)
696
{
697
        return vino->i2c_data;
698
}
699
 
700
void i2c_vino_wdata(void *data, unsigned val)
701
{
702
        vino->i2c_data = val;
703
}
704
 
705
static struct i2c_algo_sgi_data i2c_sgi_vino_data =
706
{
707
        .getctrl = &i2c_vino_getctrl,
708
        .setctrl = &i2c_vino_setctrl,
709
        .rdata   = &i2c_vino_rdata,
710
        .wdata   = &i2c_vino_wdata,
711
        .xfer_timeout = 200,
712
        .ack_timeout  = 1000,
713
};
714
 
715
/*
716
 * There are two possible clients on VINO I2C bus, so we limit usage only
717
 * to them.
718
 */
719
static int i2c_vino_client_reg(struct i2c_client *client)
720
{
721
        unsigned long flags;
722
        int ret = 0;
723
 
724
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
725
        switch (client->driver->id) {
726
        case I2C_DRIVERID_SAA7191:
727
                if (vino_drvdata->decoder.driver)
728
                        ret = -EBUSY;
729
                else
730
                        vino_drvdata->decoder.driver = client;
731
                break;
732
        case I2C_DRIVERID_INDYCAM:
733
                if (vino_drvdata->camera.driver)
734
                        ret = -EBUSY;
735
                else
736
                        vino_drvdata->camera.driver = client;
737
                break;
738
        default:
739
                ret = -ENODEV;
740
        }
741
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
742
 
743
        return ret;
744
}
745
 
746
static int i2c_vino_client_unreg(struct i2c_client *client)
747
{
748
        unsigned long flags;
749
        int ret = 0;
750
 
751
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
752
        if (client == vino_drvdata->decoder.driver) {
753
                if (vino_drvdata->decoder.owner != VINO_NO_CHANNEL)
754
                        ret = -EBUSY;
755
                else
756
                        vino_drvdata->decoder.driver = NULL;
757
        } else if (client == vino_drvdata->camera.driver) {
758
                if (vino_drvdata->camera.owner != VINO_NO_CHANNEL)
759
                        ret = -EBUSY;
760
                else
761
                        vino_drvdata->camera.driver = NULL;
762
        }
763
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
764
 
765
        return ret;
766
}
767
 
768
static struct i2c_adapter vino_i2c_adapter =
769
{
770
        .name                   = "VINO I2C bus",
771
        .id                     = I2C_HW_SGI_VINO,
772
        .algo_data              = &i2c_sgi_vino_data,
773
        .client_register        = &i2c_vino_client_reg,
774
        .client_unregister      = &i2c_vino_client_unreg,
775
};
776
 
777
static int vino_i2c_add_bus(void)
778
{
779
        return i2c_sgi_add_bus(&vino_i2c_adapter);
780
}
781
 
782
static int vino_i2c_del_bus(void)
783
{
784
        return i2c_del_adapter(&vino_i2c_adapter);
785
}
786
 
787
static int i2c_camera_command(unsigned int cmd, void *arg)
788
{
789
        return vino_drvdata->camera.driver->
790
                driver->command(vino_drvdata->camera.driver,
791
                                cmd, arg);
792
}
793
 
794
static int i2c_decoder_command(unsigned int cmd, void *arg)
795
{
796
        return vino_drvdata->decoder.driver->
797
                driver->command(vino_drvdata->decoder.driver,
798
                                cmd, arg);
799
}
800
 
801
/* VINO framebuffer/DMA descriptor management */
802
 
803
static void vino_free_buffer_with_count(struct vino_framebuffer *fb,
804
                                               unsigned int count)
805
{
806
        unsigned int i;
807
 
808
        dprintk("vino_free_buffer_with_count(): count = %d\n", count);
809
 
810
        for (i = 0; i < count; i++) {
811
                ClearPageReserved(virt_to_page(fb->desc_table.virtual[i]));
812
                dma_unmap_single(NULL,
813
                                 fb->desc_table.dma_cpu[VINO_PAGE_RATIO * i],
814
                                 PAGE_SIZE, DMA_FROM_DEVICE);
815
                free_page(fb->desc_table.virtual[i]);
816
        }
817
 
818
        dma_free_coherent(NULL,
819
                          VINO_PAGE_RATIO * (fb->desc_table.page_count + 4) *
820
                          sizeof(dma_addr_t), (void *)fb->desc_table.dma_cpu,
821
                          fb->desc_table.dma);
822
        kfree(fb->desc_table.virtual);
823
 
824
        memset(fb, 0, sizeof(struct vino_framebuffer));
825
}
826
 
827
static void vino_free_buffer(struct vino_framebuffer *fb)
828
{
829
        vino_free_buffer_with_count(fb, fb->desc_table.page_count);
830
}
831
 
832
static int vino_allocate_buffer(struct vino_framebuffer *fb,
833
                                unsigned int size)
834
{
835
        unsigned int count, i, j;
836
        int ret = 0;
837
 
838
        dprintk("vino_allocate_buffer():\n");
839
 
840
        if (size < 1)
841
                return -EINVAL;
842
 
843
        memset(fb, 0, sizeof(struct vino_framebuffer));
844
 
845
        count = ((size / PAGE_SIZE) + 4) & ~3;
846
 
847
        dprintk("vino_allocate_buffer(): size = %d, count = %d\n",
848
                size, count);
849
 
850
        /* allocate memory for table with virtual (page) addresses */
851
        fb->desc_table.virtual = (unsigned long *)
852
                kmalloc(count * sizeof(unsigned long), GFP_KERNEL);
853
        if (!fb->desc_table.virtual)
854
                return -ENOMEM;
855
 
856
        /* allocate memory for table with dma addresses
857
         * (has space for four extra descriptors) */
858
        fb->desc_table.dma_cpu =
859
                dma_alloc_coherent(NULL, VINO_PAGE_RATIO * (count + 4) *
860
                                   sizeof(dma_addr_t), &fb->desc_table.dma,
861
                                   GFP_KERNEL | GFP_DMA);
862
        if (!fb->desc_table.dma_cpu) {
863
                ret = -ENOMEM;
864
                goto out_free_virtual;
865
        }
866
 
867
        /* allocate pages for the buffer and acquire the according
868
         * dma addresses */
869
        for (i = 0; i < count; i++) {
870
                dma_addr_t dma_data_addr;
871
 
872
                fb->desc_table.virtual[i] =
873
                        get_zeroed_page(GFP_KERNEL | GFP_DMA);
874
                if (!fb->desc_table.virtual[i]) {
875
                        ret = -ENOBUFS;
876
                        break;
877
                }
878
 
879
                dma_data_addr =
880
                        dma_map_single(NULL,
881
                                       (void *)fb->desc_table.virtual[i],
882
                                       PAGE_SIZE, DMA_FROM_DEVICE);
883
 
884
                for (j = 0; j < VINO_PAGE_RATIO; j++) {
885
                        fb->desc_table.dma_cpu[VINO_PAGE_RATIO * i + j] =
886
                                dma_data_addr + VINO_PAGE_SIZE * j;
887
                }
888
 
889
                SetPageReserved(virt_to_page(fb->desc_table.virtual[i]));
890
        }
891
 
892
        /* page_count needs to be set anyway, because the descriptor table has
893
         * been allocated according to this number */
894
        fb->desc_table.page_count = count;
895
 
896
        if (ret) {
897
                /* the descriptor with index i doesn't contain
898
                 * a valid address yet */
899
                vino_free_buffer_with_count(fb, i);
900
                return ret;
901
        }
902
 
903
        //fb->size = size;
904
        fb->size = count * PAGE_SIZE;
905
        fb->data_format = VINO_DATA_FMT_NONE;
906
 
907
        /* set the dma stop-bit for the last (count+1)th descriptor */
908
        fb->desc_table.dma_cpu[VINO_PAGE_RATIO * count] = VINO_DESC_STOP;
909
        return 0;
910
 
911
 out_free_virtual:
912
        kfree(fb->desc_table.virtual);
913
        return ret;
914
}
915
 
916
#if 0
917
/* user buffers not fully implemented yet */
918
static int vino_prepare_user_buffer(struct vino_framebuffer *fb,
919
                                     void *user,
920
                                     unsigned int size)
921
{
922
        unsigned int count, i, j;
923
        int ret = 0;
924
 
925
        dprintk("vino_prepare_user_buffer():\n");
926
 
927
        if (size < 1)
928
                return -EINVAL;
929
 
930
        memset(fb, 0, sizeof(struct vino_framebuffer));
931
 
932
        count = ((size / PAGE_SIZE)) & ~3;
933
 
934
        dprintk("vino_prepare_user_buffer(): size = %d, count = %d\n",
935
                size, count);
936
 
937
        /* allocate memory for table with virtual (page) addresses */
938
        fb->desc_table.virtual = (unsigned long *)
939
                kmalloc(count * sizeof(unsigned long), GFP_KERNEL);
940
        if (!fb->desc_table.virtual)
941
                return -ENOMEM;
942
 
943
        /* allocate memory for table with dma addresses
944
         * (has space for four extra descriptors) */
945
        fb->desc_table.dma_cpu =
946
                dma_alloc_coherent(NULL, VINO_PAGE_RATIO * (count + 4) *
947
                                   sizeof(dma_addr_t), &fb->desc_table.dma,
948
                                   GFP_KERNEL | GFP_DMA);
949
        if (!fb->desc_table.dma_cpu) {
950
                ret = -ENOMEM;
951
                goto out_free_virtual;
952
        }
953
 
954
        /* allocate pages for the buffer and acquire the according
955
         * dma addresses */
956
        for (i = 0; i < count; i++) {
957
                dma_addr_t dma_data_addr;
958
 
959
                fb->desc_table.virtual[i] =
960
                        get_zeroed_page(GFP_KERNEL | GFP_DMA);
961
                if (!fb->desc_table.virtual[i]) {
962
                        ret = -ENOBUFS;
963
                        break;
964
                }
965
 
966
                dma_data_addr =
967
                        dma_map_single(NULL,
968
                                       (void *)fb->desc_table.virtual[i],
969
                                       PAGE_SIZE, DMA_FROM_DEVICE);
970
 
971
                for (j = 0; j < VINO_PAGE_RATIO; j++) {
972
                        fb->desc_table.dma_cpu[VINO_PAGE_RATIO * i + j] =
973
                                dma_data_addr + VINO_PAGE_SIZE * j;
974
                }
975
 
976
                SetPageReserved(virt_to_page(fb->desc_table.virtual[i]));
977
        }
978
 
979
        /* page_count needs to be set anyway, because the descriptor table has
980
         * been allocated according to this number */
981
        fb->desc_table.page_count = count;
982
 
983
        if (ret) {
984
                /* the descriptor with index i doesn't contain
985
                 * a valid address yet */
986
                vino_free_buffer_with_count(fb, i);
987
                return ret;
988
        }
989
 
990
        //fb->size = size;
991
        fb->size = count * PAGE_SIZE;
992
 
993
        /* set the dma stop-bit for the last (count+1)th descriptor */
994
        fb->desc_table.dma_cpu[VINO_PAGE_RATIO * count] = VINO_DESC_STOP;
995
        return 0;
996
 
997
 out_free_virtual:
998
        kfree(fb->desc_table.virtual);
999
        return ret;
1000
}
1001
#endif
1002
 
1003
static void vino_sync_buffer(struct vino_framebuffer *fb)
1004
{
1005
        int i;
1006
 
1007
        dprintk("vino_sync_buffer():\n");
1008
 
1009
        for (i = 0; i < fb->desc_table.page_count; i++)
1010
                dma_sync_single(NULL,
1011
                                fb->desc_table.dma_cpu[VINO_PAGE_RATIO * i],
1012
                                PAGE_SIZE, DMA_FROM_DEVICE);
1013
}
1014
 
1015
/* Framebuffer fifo functions (need to be locked externally) */
1016
 
1017
static inline void vino_fifo_init(struct vino_framebuffer_fifo *f,
1018
                           unsigned int length)
1019
{
1020
        f->length = 0;
1021
        f->used = 0;
1022
        f->head = 0;
1023
        f->tail = 0;
1024
 
1025
        if (length > VINO_FRAMEBUFFER_COUNT_MAX)
1026
                length = VINO_FRAMEBUFFER_COUNT_MAX;
1027
 
1028
        f->length = length;
1029
}
1030
 
1031
/* returns true/false */
1032
static inline int vino_fifo_has_id(struct vino_framebuffer_fifo *f,
1033
                                   unsigned int id)
1034
{
1035
        unsigned int i;
1036
 
1037
        for (i = f->head; i == (f->tail - 1); i = (i + 1) % f->length) {
1038
                if (f->data[i] == id)
1039
                        return 1;
1040
        }
1041
 
1042
        return 0;
1043
}
1044
 
1045
#if 0
1046
/* returns true/false */
1047
static inline int vino_fifo_full(struct vino_framebuffer_fifo *f)
1048
{
1049
        return (f->used == f->length);
1050
}
1051
#endif
1052
 
1053
static inline unsigned int vino_fifo_get_used(struct vino_framebuffer_fifo *f)
1054
{
1055
        return f->used;
1056
}
1057
 
1058
static int vino_fifo_enqueue(struct vino_framebuffer_fifo *f, unsigned int id)
1059
{
1060
        if (id >= f->length) {
1061
                return VINO_QUEUE_ERROR;
1062
        }
1063
 
1064
        if (vino_fifo_has_id(f, id)) {
1065
                return VINO_QUEUE_ERROR;
1066
        }
1067
 
1068
        if (f->used < f->length) {
1069
                f->data[f->tail] = id;
1070
                f->tail = (f->tail + 1) % f->length;
1071
                f->used++;
1072
        } else {
1073
                return VINO_QUEUE_ERROR;
1074
        }
1075
 
1076
        return 0;
1077
}
1078
 
1079
static int vino_fifo_peek(struct vino_framebuffer_fifo *f, unsigned int *id)
1080
{
1081
        if (f->used > 0) {
1082
                *id = f->data[f->head];
1083
        } else {
1084
                return VINO_QUEUE_ERROR;
1085
        }
1086
 
1087
        return 0;
1088
}
1089
 
1090
static int vino_fifo_dequeue(struct vino_framebuffer_fifo *f, unsigned int *id)
1091
{
1092
        if (f->used > 0) {
1093
                *id = f->data[f->head];
1094
                f->head = (f->head + 1) % f->length;
1095
                f->used--;
1096
        } else {
1097
                return VINO_QUEUE_ERROR;
1098
        }
1099
 
1100
        return 0;
1101
}
1102
 
1103
/* Framebuffer queue functions */
1104
 
1105
/* execute with queue_lock locked */
1106
static void vino_queue_free_with_count(struct vino_framebuffer_queue *q,
1107
                                       unsigned int length)
1108
{
1109
        unsigned int i;
1110
 
1111
        q->length = 0;
1112
        memset(&q->in, 0, sizeof(struct vino_framebuffer_fifo));
1113
        memset(&q->out, 0, sizeof(struct vino_framebuffer_fifo));
1114
        for (i = 0; i < length; i++) {
1115
                dprintk("vino_queue_free_with_count(): freeing buffer %d\n",
1116
                        i);
1117
                vino_free_buffer(q->buffer[i]);
1118
                kfree(q->buffer[i]);
1119
        }
1120
 
1121
        q->type = VINO_MEMORY_NONE;
1122
        q->magic = 0;
1123
}
1124
 
1125
static void vino_queue_free(struct vino_framebuffer_queue *q)
1126
{
1127
        dprintk("vino_queue_free():\n");
1128
 
1129
        if (q->magic != VINO_QUEUE_MAGIC)
1130
                return;
1131
        if (q->type != VINO_MEMORY_MMAP)
1132
                return;
1133
 
1134
        mutex_lock(&q->queue_mutex);
1135
 
1136
        vino_queue_free_with_count(q, q->length);
1137
 
1138
        mutex_unlock(&q->queue_mutex);
1139
}
1140
 
1141
static int vino_queue_init(struct vino_framebuffer_queue *q,
1142
                           unsigned int *length)
1143
{
1144
        unsigned int i;
1145
        int ret = 0;
1146
 
1147
        dprintk("vino_queue_init(): length = %d\n", *length);
1148
 
1149
        if (q->magic == VINO_QUEUE_MAGIC) {
1150
                dprintk("vino_queue_init(): queue already initialized!\n");
1151
                return -EINVAL;
1152
        }
1153
 
1154
        if (q->type != VINO_MEMORY_NONE) {
1155
                dprintk("vino_queue_init(): queue already initialized!\n");
1156
                return -EINVAL;
1157
        }
1158
 
1159
        if (*length < 1)
1160
                return -EINVAL;
1161
 
1162
        mutex_lock(&q->queue_mutex);
1163
 
1164
        if (*length > VINO_FRAMEBUFFER_COUNT_MAX)
1165
                *length = VINO_FRAMEBUFFER_COUNT_MAX;
1166
 
1167
        q->length = 0;
1168
 
1169
        for (i = 0; i < *length; i++) {
1170
                dprintk("vino_queue_init(): allocating buffer %d\n", i);
1171
                q->buffer[i] = kmalloc(sizeof(struct vino_framebuffer),
1172
                                       GFP_KERNEL);
1173
                if (!q->buffer[i]) {
1174
                        dprintk("vino_queue_init(): kmalloc() failed\n");
1175
                        ret = -ENOMEM;
1176
                        break;
1177
                }
1178
 
1179
                ret = vino_allocate_buffer(q->buffer[i],
1180
                                           VINO_FRAMEBUFFER_SIZE);
1181
                if (ret) {
1182
                        kfree(q->buffer[i]);
1183
                        dprintk("vino_queue_init(): "
1184
                                "vino_allocate_buffer() failed\n");
1185
                        break;
1186
                }
1187
 
1188
                q->buffer[i]->id = i;
1189
                if (i > 0) {
1190
                        q->buffer[i]->offset = q->buffer[i - 1]->offset +
1191
                                q->buffer[i - 1]->size;
1192
                } else {
1193
                        q->buffer[i]->offset = 0;
1194
                }
1195
 
1196
                spin_lock_init(&q->buffer[i]->state_lock);
1197
 
1198
                dprintk("vino_queue_init(): buffer = %d, offset = %d, "
1199
                        "size = %d\n", i, q->buffer[i]->offset,
1200
                        q->buffer[i]->size);
1201
        }
1202
 
1203
        if (ret) {
1204
                vino_queue_free_with_count(q, i);
1205
                *length = 0;
1206
        } else {
1207
                q->length = *length;
1208
                vino_fifo_init(&q->in, q->length);
1209
                vino_fifo_init(&q->out, q->length);
1210
                q->type = VINO_MEMORY_MMAP;
1211
                q->magic = VINO_QUEUE_MAGIC;
1212
        }
1213
 
1214
        mutex_unlock(&q->queue_mutex);
1215
 
1216
        return ret;
1217
}
1218
 
1219
static struct vino_framebuffer *vino_queue_add(struct
1220
                                               vino_framebuffer_queue *q,
1221
                                               unsigned int id)
1222
{
1223
        struct vino_framebuffer *ret = NULL;
1224
        unsigned int total;
1225
        unsigned long flags;
1226
 
1227
        dprintk("vino_queue_add(): id = %d\n", id);
1228
 
1229
        if (q->magic != VINO_QUEUE_MAGIC) {
1230
                return ret;
1231
        }
1232
 
1233
        spin_lock_irqsave(&q->queue_lock, flags);
1234
 
1235
        if (q->length == 0)
1236
                goto out;
1237
 
1238
        if (id >= q->length)
1239
                goto out;
1240
 
1241
        /* not needed?: if (vino_fifo_full(&q->out)) {
1242
                goto out;
1243
                }*/
1244
        /* check that outgoing queue isn't already full
1245
         * (or that it won't become full) */
1246
        total = vino_fifo_get_used(&q->in) +
1247
                vino_fifo_get_used(&q->out);
1248
        if (total >= q->length)
1249
                goto out;
1250
 
1251
        if (vino_fifo_enqueue(&q->in, id))
1252
                goto out;
1253
 
1254
        ret = q->buffer[id];
1255
 
1256
out:
1257
        spin_unlock_irqrestore(&q->queue_lock, flags);
1258
 
1259
        return ret;
1260
}
1261
 
1262
static struct vino_framebuffer *vino_queue_transfer(struct
1263
                                                    vino_framebuffer_queue *q)
1264
{
1265
        struct vino_framebuffer *ret = NULL;
1266
        struct vino_framebuffer *fb;
1267
        int id;
1268
        unsigned long flags;
1269
 
1270
        dprintk("vino_queue_transfer():\n");
1271
 
1272
        if (q->magic != VINO_QUEUE_MAGIC) {
1273
                return ret;
1274
        }
1275
 
1276
        spin_lock_irqsave(&q->queue_lock, flags);
1277
 
1278
        if (q->length == 0)
1279
                goto out;
1280
 
1281
        // now this actually removes an entry from the incoming queue
1282
        if (vino_fifo_dequeue(&q->in, &id)) {
1283
                goto out;
1284
        }
1285
 
1286
        dprintk("vino_queue_transfer(): id = %d\n", id);
1287
        fb = q->buffer[id];
1288
 
1289
        // we have already checked that the outgoing queue is not full, but...
1290
        if (vino_fifo_enqueue(&q->out, id)) {
1291
                printk(KERN_ERR "vino_queue_transfer(): "
1292
                       "outgoing queue is full, this shouldn't happen!\n");
1293
                goto out;
1294
        }
1295
 
1296
        ret = fb;
1297
out:
1298
        spin_unlock_irqrestore(&q->queue_lock, flags);
1299
 
1300
        return ret;
1301
}
1302
 
1303
/* returns true/false */
1304
static int vino_queue_incoming_contains(struct vino_framebuffer_queue *q,
1305
                                        unsigned int id)
1306
{
1307
        int ret = 0;
1308
        unsigned long flags;
1309
 
1310
        if (q->magic != VINO_QUEUE_MAGIC) {
1311
                return ret;
1312
        }
1313
 
1314
        spin_lock_irqsave(&q->queue_lock, flags);
1315
 
1316
        if (q->length == 0)
1317
                goto out;
1318
 
1319
        ret = vino_fifo_has_id(&q->in, id);
1320
 
1321
out:
1322
        spin_unlock_irqrestore(&q->queue_lock, flags);
1323
 
1324
        return ret;
1325
}
1326
 
1327
/* returns true/false */
1328
static int vino_queue_outgoing_contains(struct vino_framebuffer_queue *q,
1329
                                        unsigned int id)
1330
{
1331
        int ret = 0;
1332
        unsigned long flags;
1333
 
1334
        if (q->magic != VINO_QUEUE_MAGIC) {
1335
                return ret;
1336
        }
1337
 
1338
        spin_lock_irqsave(&q->queue_lock, flags);
1339
 
1340
        if (q->length == 0)
1341
                goto out;
1342
 
1343
        ret = vino_fifo_has_id(&q->out, id);
1344
 
1345
out:
1346
        spin_unlock_irqrestore(&q->queue_lock, flags);
1347
 
1348
        return ret;
1349
}
1350
 
1351
static int vino_queue_get_incoming(struct vino_framebuffer_queue *q,
1352
                                   unsigned int *used)
1353
{
1354
        int ret = 0;
1355
        unsigned long flags;
1356
 
1357
        if (q->magic != VINO_QUEUE_MAGIC) {
1358
                return VINO_QUEUE_ERROR;
1359
        }
1360
 
1361
        spin_lock_irqsave(&q->queue_lock, flags);
1362
 
1363
        if (q->length == 0) {
1364
                ret = VINO_QUEUE_ERROR;
1365
                goto out;
1366
        }
1367
 
1368
        *used = vino_fifo_get_used(&q->in);
1369
 
1370
out:
1371
        spin_unlock_irqrestore(&q->queue_lock, flags);
1372
 
1373
        return ret;
1374
}
1375
 
1376
static int vino_queue_get_outgoing(struct vino_framebuffer_queue *q,
1377
                                   unsigned int *used)
1378
{
1379
        int ret = 0;
1380
        unsigned long flags;
1381
 
1382
        if (q->magic != VINO_QUEUE_MAGIC) {
1383
                return VINO_QUEUE_ERROR;
1384
        }
1385
 
1386
        spin_lock_irqsave(&q->queue_lock, flags);
1387
 
1388
        if (q->length == 0) {
1389
                ret = VINO_QUEUE_ERROR;
1390
                goto out;
1391
        }
1392
 
1393
        *used = vino_fifo_get_used(&q->out);
1394
 
1395
out:
1396
        spin_unlock_irqrestore(&q->queue_lock, flags);
1397
 
1398
        return ret;
1399
}
1400
 
1401
#if 0
1402
static int vino_queue_get_total(struct vino_framebuffer_queue *q,
1403
                                unsigned int *total)
1404
{
1405
        int ret = 0;
1406
        unsigned long flags;
1407
 
1408
        if (q->magic != VINO_QUEUE_MAGIC) {
1409
                return VINO_QUEUE_ERROR;
1410
        }
1411
 
1412
        spin_lock_irqsave(&q->queue_lock, flags);
1413
 
1414
        if (q->length == 0) {
1415
                ret = VINO_QUEUE_ERROR;
1416
                goto out;
1417
        }
1418
 
1419
        *total = vino_fifo_get_used(&q->in) +
1420
                vino_fifo_get_used(&q->out);
1421
 
1422
out:
1423
        spin_unlock_irqrestore(&q->queue_lock, flags);
1424
 
1425
        return ret;
1426
}
1427
#endif
1428
 
1429
static struct vino_framebuffer *vino_queue_peek(struct
1430
                                                vino_framebuffer_queue *q,
1431
                                                unsigned int *id)
1432
{
1433
        struct vino_framebuffer *ret = NULL;
1434
        unsigned long flags;
1435
 
1436
        if (q->magic != VINO_QUEUE_MAGIC) {
1437
                return ret;
1438
        }
1439
 
1440
        spin_lock_irqsave(&q->queue_lock, flags);
1441
 
1442
        if (q->length == 0)
1443
                goto out;
1444
 
1445
        if (vino_fifo_peek(&q->in, id)) {
1446
                goto out;
1447
        }
1448
 
1449
        ret = q->buffer[*id];
1450
out:
1451
        spin_unlock_irqrestore(&q->queue_lock, flags);
1452
 
1453
        return ret;
1454
}
1455
 
1456
static struct vino_framebuffer *vino_queue_remove(struct
1457
                                                  vino_framebuffer_queue *q,
1458
                                                  unsigned int *id)
1459
{
1460
        struct vino_framebuffer *ret = NULL;
1461
        unsigned long flags;
1462
        dprintk("vino_queue_remove():\n");
1463
 
1464
        if (q->magic != VINO_QUEUE_MAGIC) {
1465
                return ret;
1466
        }
1467
 
1468
        spin_lock_irqsave(&q->queue_lock, flags);
1469
 
1470
        if (q->length == 0)
1471
                goto out;
1472
 
1473
        if (vino_fifo_dequeue(&q->out, id)) {
1474
                goto out;
1475
        }
1476
 
1477
        dprintk("vino_queue_remove(): id = %d\n", *id);
1478
        ret = q->buffer[*id];
1479
out:
1480
        spin_unlock_irqrestore(&q->queue_lock, flags);
1481
 
1482
        return ret;
1483
}
1484
 
1485
static struct
1486
vino_framebuffer *vino_queue_get_buffer(struct vino_framebuffer_queue *q,
1487
                                        unsigned int id)
1488
{
1489
        struct vino_framebuffer *ret = NULL;
1490
        unsigned long flags;
1491
 
1492
        if (q->magic != VINO_QUEUE_MAGIC) {
1493
                return ret;
1494
        }
1495
 
1496
        spin_lock_irqsave(&q->queue_lock, flags);
1497
 
1498
        if (q->length == 0)
1499
                goto out;
1500
 
1501
        if (id >= q->length)
1502
                goto out;
1503
 
1504
        ret = q->buffer[id];
1505
 out:
1506
        spin_unlock_irqrestore(&q->queue_lock, flags);
1507
 
1508
        return ret;
1509
}
1510
 
1511
static unsigned int vino_queue_get_length(struct vino_framebuffer_queue *q)
1512
{
1513
        unsigned int length = 0;
1514
        unsigned long flags;
1515
 
1516
        if (q->magic != VINO_QUEUE_MAGIC) {
1517
                return length;
1518
        }
1519
 
1520
        spin_lock_irqsave(&q->queue_lock, flags);
1521
        length = q->length;
1522
        spin_unlock_irqrestore(&q->queue_lock, flags);
1523
 
1524
        return length;
1525
}
1526
 
1527
static int vino_queue_has_mapped_buffers(struct vino_framebuffer_queue *q)
1528
{
1529
        unsigned int i;
1530
        int ret = 0;
1531
        unsigned long flags;
1532
 
1533
        if (q->magic != VINO_QUEUE_MAGIC) {
1534
                return ret;
1535
        }
1536
 
1537
        spin_lock_irqsave(&q->queue_lock, flags);
1538
        for (i = 0; i < q->length; i++) {
1539
                if (q->buffer[i]->map_count > 0) {
1540
                        ret = 1;
1541
                        break;
1542
                }
1543
        }
1544
        spin_unlock_irqrestore(&q->queue_lock, flags);
1545
 
1546
        return ret;
1547
}
1548
 
1549
/* VINO functions */
1550
 
1551
/* execute with input_lock locked */
1552
static void vino_update_line_size(struct vino_channel_settings *vcs)
1553
{
1554
        unsigned int w = vcs->clipping.right - vcs->clipping.left;
1555
        unsigned int d = vcs->decimation;
1556
        unsigned int bpp = vino_data_formats[vcs->data_format].bpp;
1557
        unsigned int lsize;
1558
 
1559
        dprintk("update_line_size(): before: w = %d, d = %d, "
1560
                "line_size = %d\n", w, d, vcs->line_size);
1561
 
1562
        /* line size must be multiple of 8 bytes */
1563
        lsize = (bpp * (w / d)) & ~7;
1564
        w = (lsize / bpp) * d;
1565
 
1566
        vcs->clipping.right = vcs->clipping.left + w;
1567
        vcs->line_size = lsize;
1568
 
1569
        dprintk("update_line_size(): after: w = %d, d = %d, "
1570
                "line_size = %d\n", w, d, vcs->line_size);
1571
}
1572
 
1573
/* execute with input_lock locked */
1574
static void vino_set_clipping(struct vino_channel_settings *vcs,
1575
                              unsigned int x, unsigned int y,
1576
                              unsigned int w, unsigned int h)
1577
{
1578
        unsigned int maxwidth, maxheight;
1579
        unsigned int d;
1580
 
1581
        maxwidth = vino_data_norms[vcs->data_norm].width;
1582
        maxheight = vino_data_norms[vcs->data_norm].height;
1583
        d = vcs->decimation;
1584
 
1585
        y &= ~1;        /* odd/even fields */
1586
 
1587
        if (x > maxwidth) {
1588
                x = 0;
1589
        }
1590
        if (y > maxheight) {
1591
                y = 0;
1592
        }
1593
 
1594
        if (((w / d) < VINO_MIN_WIDTH)
1595
            || ((h / d) < VINO_MIN_HEIGHT)) {
1596
                w = VINO_MIN_WIDTH * d;
1597
                h = VINO_MIN_HEIGHT * d;
1598
        }
1599
 
1600
        if ((x + w) > maxwidth) {
1601
                w = maxwidth - x;
1602
                if ((w / d) < VINO_MIN_WIDTH)
1603
                        x = maxwidth - VINO_MIN_WIDTH * d;
1604
        }
1605
        if ((y + h) > maxheight) {
1606
                h = maxheight - y;
1607
                if ((h / d) < VINO_MIN_HEIGHT)
1608
                        y = maxheight - VINO_MIN_HEIGHT * d;
1609
        }
1610
 
1611
        vcs->clipping.left = x;
1612
        vcs->clipping.top = y;
1613
        vcs->clipping.right = x + w;
1614
        vcs->clipping.bottom = y + h;
1615
 
1616
        vino_update_line_size(vcs);
1617
 
1618
        dprintk("clipping %d, %d, %d, %d / %d - %d\n",
1619
                vcs->clipping.left, vcs->clipping.top, vcs->clipping.right,
1620
                vcs->clipping.bottom, vcs->decimation, vcs->line_size);
1621
}
1622
 
1623
/* execute with input_lock locked */
1624
static inline void vino_set_default_clipping(struct vino_channel_settings *vcs)
1625
{
1626
        vino_set_clipping(vcs, 0, 0, vino_data_norms[vcs->data_norm].width,
1627
                          vino_data_norms[vcs->data_norm].height);
1628
}
1629
 
1630
/* execute with input_lock locked */
1631
static void vino_set_scaling(struct vino_channel_settings *vcs,
1632
                             unsigned int w, unsigned int h)
1633
{
1634
        unsigned int x, y, curw, curh, d;
1635
 
1636
        x = vcs->clipping.left;
1637
        y = vcs->clipping.top;
1638
        curw = vcs->clipping.right - vcs->clipping.left;
1639
        curh = vcs->clipping.bottom - vcs->clipping.top;
1640
 
1641
        d = max(curw / w, curh / h);
1642
 
1643
        dprintk("scaling w: %d, h: %d, curw: %d, curh: %d, d: %d\n",
1644
                w, h, curw, curh, d);
1645
 
1646
        if (d < 1) {
1647
                d = 1;
1648
        } else if (d > 8) {
1649
                d = 8;
1650
        }
1651
 
1652
        vcs->decimation = d;
1653
        vino_set_clipping(vcs, x, y, w * d, h * d);
1654
 
1655
        dprintk("scaling %d, %d, %d, %d / %d - %d\n", vcs->clipping.left,
1656
                vcs->clipping.top, vcs->clipping.right, vcs->clipping.bottom,
1657
                vcs->decimation, vcs->line_size);
1658
}
1659
 
1660
/* execute with input_lock locked */
1661
static inline void vino_set_default_scaling(struct vino_channel_settings *vcs)
1662
{
1663
        vino_set_scaling(vcs, vcs->clipping.right - vcs->clipping.left,
1664
                         vcs->clipping.bottom - vcs->clipping.top);
1665
}
1666
 
1667
/* execute with input_lock locked */
1668
static void vino_set_framerate(struct vino_channel_settings *vcs,
1669
                               unsigned int fps)
1670
{
1671
        unsigned int mask;
1672
 
1673
        switch (vcs->data_norm) {
1674
        case VINO_DATA_NORM_NTSC:
1675
        case VINO_DATA_NORM_D1:
1676
                fps = (unsigned int)(fps / 6) * 6; // FIXME: round!
1677
 
1678
                if (fps < vino_data_norms[vcs->data_norm].fps_min)
1679
                        fps = vino_data_norms[vcs->data_norm].fps_min;
1680
                if (fps > vino_data_norms[vcs->data_norm].fps_max)
1681
                        fps = vino_data_norms[vcs->data_norm].fps_max;
1682
 
1683
                switch (fps) {
1684
                case 6:
1685
                        mask = 0x003;
1686
                        break;
1687
                case 12:
1688
                        mask = 0x0c3;
1689
                        break;
1690
                case 18:
1691
                        mask = 0x333;
1692
                        break;
1693
                case 24:
1694
                        mask = 0x3ff;
1695
                        break;
1696
                case 30:
1697
                        mask = 0xfff;
1698
                        break;
1699
                default:
1700
                        mask = VINO_FRAMERT_FULL;
1701
                }
1702
                vcs->framert_reg = VINO_FRAMERT_RT(mask);
1703
                break;
1704
        case VINO_DATA_NORM_PAL:
1705
        case VINO_DATA_NORM_SECAM:
1706
                fps = (unsigned int)(fps / 5) * 5; // FIXME: round!
1707
 
1708
                if (fps < vino_data_norms[vcs->data_norm].fps_min)
1709
                        fps = vino_data_norms[vcs->data_norm].fps_min;
1710
                if (fps > vino_data_norms[vcs->data_norm].fps_max)
1711
                        fps = vino_data_norms[vcs->data_norm].fps_max;
1712
 
1713
                switch (fps) {
1714
                case 5:
1715
                        mask = 0x003;
1716
                        break;
1717
                case 10:
1718
                        mask = 0x0c3;
1719
                        break;
1720
                case 15:
1721
                        mask = 0x333;
1722
                        break;
1723
                case 20:
1724
                        mask = 0x0ff;
1725
                        break;
1726
                case 25:
1727
                        mask = 0x3ff;
1728
                        break;
1729
                default:
1730
                        mask = VINO_FRAMERT_FULL;
1731
                }
1732
                vcs->framert_reg = VINO_FRAMERT_RT(mask) | VINO_FRAMERT_PAL;
1733
                break;
1734
        }
1735
 
1736
        vcs->fps = fps;
1737
}
1738
 
1739
/* execute with input_lock locked */
1740
static inline void vino_set_default_framerate(struct
1741
                                              vino_channel_settings *vcs)
1742
{
1743
        vino_set_framerate(vcs, vino_data_norms[vcs->data_norm].fps_max);
1744
}
1745
 
1746
/*
1747
 * Prepare VINO for DMA transfer...
1748
 * (execute only with vino_lock and input_lock locked)
1749
 */
1750
static int vino_dma_setup(struct vino_channel_settings *vcs,
1751
                          struct vino_framebuffer *fb)
1752
{
1753
        u32 ctrl, intr;
1754
        struct sgi_vino_channel *ch;
1755
        const struct vino_data_norm *norm;
1756
 
1757
        dprintk("vino_dma_setup():\n");
1758
 
1759
        vcs->field = 0;
1760
        fb->frame_counter = 0;
1761
 
1762
        ch = (vcs->channel == VINO_CHANNEL_A) ? &vino->a : &vino->b;
1763
        norm = &vino_data_norms[vcs->data_norm];
1764
 
1765
        ch->page_index = 0;
1766
        ch->line_count = 0;
1767
 
1768
        /* VINO line size register is set 8 bytes less than actual */
1769
        ch->line_size = vcs->line_size - 8;
1770
 
1771
        /* let VINO know where to transfer data */
1772
        ch->start_desc_tbl = fb->desc_table.dma;
1773
        ch->next_4_desc = fb->desc_table.dma;
1774
 
1775
        /* give vino time to fetch the first four descriptors, 5 usec
1776
         * should be more than enough time */
1777
        udelay(VINO_DESC_FETCH_DELAY);
1778
 
1779
        dprintk("vino_dma_setup(): start desc = %08x, next 4 desc = %08x\n",
1780
                ch->start_desc_tbl, ch->next_4_desc);
1781
 
1782
        /* set the alpha register */
1783
        ch->alpha = vcs->alpha;
1784
 
1785
        /* set clipping registers */
1786
        ch->clip_start = VINO_CLIP_ODD(norm->odd.top + vcs->clipping.top / 2) |
1787
                VINO_CLIP_EVEN(norm->even.top +
1788
                               vcs->clipping.top / 2) |
1789
                VINO_CLIP_X(vcs->clipping.left);
1790
        ch->clip_end = VINO_CLIP_ODD(norm->odd.top +
1791
                                     vcs->clipping.bottom / 2 - 1) |
1792
                VINO_CLIP_EVEN(norm->even.top +
1793
                               vcs->clipping.bottom / 2 - 1) |
1794
                VINO_CLIP_X(vcs->clipping.right);
1795
 
1796
        /* set the size of actual content in the buffer (DECIMATION !) */
1797
        fb->data_size = ((vcs->clipping.right - vcs->clipping.left) /
1798
                         vcs->decimation) *
1799
                ((vcs->clipping.bottom - vcs->clipping.top) /
1800
                 vcs->decimation) *
1801
                vino_data_formats[vcs->data_format].bpp;
1802
 
1803
        ch->frame_rate = vcs->framert_reg;
1804
 
1805
        ctrl = vino->control;
1806
        intr = vino->intr_status;
1807
 
1808
        if (vcs->channel == VINO_CHANNEL_A) {
1809
                /* All interrupt conditions for this channel was cleared
1810
                 * so clear the interrupt status register and enable
1811
                 * interrupts */
1812
                intr &= ~VINO_INTSTAT_A;
1813
                ctrl |= VINO_CTRL_A_INT;
1814
 
1815
                /* enable synchronization */
1816
                ctrl |= VINO_CTRL_A_SYNC_ENBL;
1817
 
1818
                /* enable frame assembly */
1819
                ctrl |= VINO_CTRL_A_INTERLEAVE_ENBL;
1820
 
1821
                /* set decimation used */
1822
                if (vcs->decimation < 2)
1823
                        ctrl &= ~VINO_CTRL_A_DEC_ENBL;
1824
                else {
1825
                        ctrl |= VINO_CTRL_A_DEC_ENBL;
1826
                        ctrl &= ~VINO_CTRL_A_DEC_SCALE_MASK;
1827
                        ctrl |= (vcs->decimation - 1) <<
1828
                                VINO_CTRL_A_DEC_SCALE_SHIFT;
1829
                }
1830
 
1831
                /* select input interface */
1832
                if (vcs->input == VINO_INPUT_D1)
1833
                        ctrl |= VINO_CTRL_A_SELECT;
1834
                else
1835
                        ctrl &= ~VINO_CTRL_A_SELECT;
1836
 
1837
                /* palette */
1838
                ctrl &= ~(VINO_CTRL_A_LUMA_ONLY | VINO_CTRL_A_RGB |
1839
                          VINO_CTRL_A_DITHER);
1840
        } else {
1841
                intr &= ~VINO_INTSTAT_B;
1842
                ctrl |= VINO_CTRL_B_INT;
1843
 
1844
                ctrl |= VINO_CTRL_B_SYNC_ENBL;
1845
                ctrl |= VINO_CTRL_B_INTERLEAVE_ENBL;
1846
 
1847
                if (vcs->decimation < 2)
1848
                        ctrl &= ~VINO_CTRL_B_DEC_ENBL;
1849
                else {
1850
                        ctrl |= VINO_CTRL_B_DEC_ENBL;
1851
                        ctrl &= ~VINO_CTRL_B_DEC_SCALE_MASK;
1852
                        ctrl |= (vcs->decimation - 1) <<
1853
                                VINO_CTRL_B_DEC_SCALE_SHIFT;
1854
 
1855
                }
1856
                if (vcs->input == VINO_INPUT_D1)
1857
                        ctrl |= VINO_CTRL_B_SELECT;
1858
                else
1859
                        ctrl &= ~VINO_CTRL_B_SELECT;
1860
 
1861
                ctrl &= ~(VINO_CTRL_B_LUMA_ONLY | VINO_CTRL_B_RGB |
1862
                          VINO_CTRL_B_DITHER);
1863
        }
1864
 
1865
        /* set palette */
1866
        fb->data_format = vcs->data_format;
1867
 
1868
        switch (vcs->data_format) {
1869
                case VINO_DATA_FMT_GREY:
1870
                        ctrl |= (vcs->channel == VINO_CHANNEL_A) ?
1871
                                VINO_CTRL_A_LUMA_ONLY : VINO_CTRL_B_LUMA_ONLY;
1872
                        break;
1873
                case VINO_DATA_FMT_RGB32:
1874
                        ctrl |= (vcs->channel == VINO_CHANNEL_A) ?
1875
                                VINO_CTRL_A_RGB : VINO_CTRL_B_RGB;
1876
                        break;
1877
                case VINO_DATA_FMT_YUV:
1878
                        /* nothing needs to be done */
1879
                        break;
1880
                case VINO_DATA_FMT_RGB332:
1881
                        ctrl |= (vcs->channel == VINO_CHANNEL_A) ?
1882
                                VINO_CTRL_A_RGB | VINO_CTRL_A_DITHER :
1883
                                VINO_CTRL_B_RGB | VINO_CTRL_B_DITHER;
1884
                        break;
1885
        }
1886
 
1887
        vino->intr_status = intr;
1888
        vino->control = ctrl;
1889
 
1890
        return 0;
1891
}
1892
 
1893
/* (execute only with vino_lock locked) */
1894
static inline void vino_dma_start(struct vino_channel_settings *vcs)
1895
{
1896
        u32 ctrl = vino->control;
1897
 
1898
        dprintk("vino_dma_start():\n");
1899
        ctrl |= (vcs->channel == VINO_CHANNEL_A) ?
1900
                VINO_CTRL_A_DMA_ENBL : VINO_CTRL_B_DMA_ENBL;
1901
        vino->control = ctrl;
1902
}
1903
 
1904
/* (execute only with vino_lock locked) */
1905
static inline void vino_dma_stop(struct vino_channel_settings *vcs)
1906
{
1907
        u32 ctrl = vino->control;
1908
 
1909
        ctrl &= (vcs->channel == VINO_CHANNEL_A) ?
1910
                ~VINO_CTRL_A_DMA_ENBL : ~VINO_CTRL_B_DMA_ENBL;
1911
        ctrl &= (vcs->channel == VINO_CHANNEL_A) ?
1912
                ~VINO_CTRL_A_INT : ~VINO_CTRL_B_INT;
1913
        vino->control = ctrl;
1914
        dprintk("vino_dma_stop():\n");
1915
}
1916
 
1917
/*
1918
 * Load dummy page to descriptor registers. This prevents generating of
1919
 * spurious interrupts. (execute only with vino_lock locked)
1920
 */
1921
static void vino_clear_interrupt(struct vino_channel_settings *vcs)
1922
{
1923
        struct sgi_vino_channel *ch;
1924
 
1925
        ch = (vcs->channel == VINO_CHANNEL_A) ? &vino->a : &vino->b;
1926
 
1927
        ch->page_index = 0;
1928
        ch->line_count = 0;
1929
 
1930
        ch->start_desc_tbl = vino_drvdata->dummy_desc_table.dma;
1931
        ch->next_4_desc = vino_drvdata->dummy_desc_table.dma;
1932
 
1933
        udelay(VINO_DESC_FETCH_DELAY);
1934
        dprintk("channel %c clear interrupt condition\n",
1935
               (vcs->channel == VINO_CHANNEL_A) ? 'A':'B');
1936
}
1937
 
1938
static int vino_capture(struct vino_channel_settings *vcs,
1939
                        struct vino_framebuffer *fb)
1940
{
1941
        int err = 0;
1942
        unsigned long flags, flags2;
1943
 
1944
        spin_lock_irqsave(&fb->state_lock, flags);
1945
 
1946
        if (fb->state == VINO_FRAMEBUFFER_IN_USE)
1947
                err = -EBUSY;
1948
        fb->state = VINO_FRAMEBUFFER_IN_USE;
1949
 
1950
        spin_unlock_irqrestore(&fb->state_lock, flags);
1951
 
1952
        if (err)
1953
                return err;
1954
 
1955
        spin_lock_irqsave(&vino_drvdata->vino_lock, flags);
1956
        spin_lock_irqsave(&vino_drvdata->input_lock, flags2);
1957
 
1958
        vino_dma_setup(vcs, fb);
1959
        vino_dma_start(vcs);
1960
 
1961
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags2);
1962
        spin_unlock_irqrestore(&vino_drvdata->vino_lock, flags);
1963
 
1964
        return err;
1965
}
1966
 
1967
static
1968
struct vino_framebuffer *vino_capture_enqueue(struct
1969
                                              vino_channel_settings *vcs,
1970
                                              unsigned int index)
1971
{
1972
        struct vino_framebuffer *fb;
1973
        unsigned long flags;
1974
 
1975
        dprintk("vino_capture_enqueue():\n");
1976
 
1977
        spin_lock_irqsave(&vcs->capture_lock, flags);
1978
 
1979
        fb = vino_queue_add(&vcs->fb_queue, index);
1980
        if (fb == NULL) {
1981
                dprintk("vino_capture_enqueue(): vino_queue_add() failed, "
1982
                        "queue full?\n");
1983
                goto out;
1984
        }
1985
out:
1986
        spin_unlock_irqrestore(&vcs->capture_lock, flags);
1987
 
1988
        return fb;
1989
}
1990
 
1991
static int vino_capture_next(struct vino_channel_settings *vcs, int start)
1992
{
1993
        struct vino_framebuffer *fb;
1994
        unsigned int incoming, id;
1995
        int err = 0;
1996
        unsigned long flags;
1997
 
1998
        dprintk("vino_capture_next():\n");
1999
 
2000
        spin_lock_irqsave(&vcs->capture_lock, flags);
2001
 
2002
        if (start) {
2003
                /* start capture only if capture isn't in progress already */
2004
                if (vcs->capturing) {
2005
                        spin_unlock_irqrestore(&vcs->capture_lock, flags);
2006
                        return 0;
2007
                }
2008
 
2009
        } else {
2010
                /* capture next frame:
2011
                 * stop capture if capturing is not set */
2012
                if (!vcs->capturing) {
2013
                        spin_unlock_irqrestore(&vcs->capture_lock, flags);
2014
                        return 0;
2015
                }
2016
        }
2017
 
2018
        err = vino_queue_get_incoming(&vcs->fb_queue, &incoming);
2019
        if (err) {
2020
                dprintk("vino_capture_next(): vino_queue_get_incoming() "
2021
                        "failed\n");
2022
                err = -EINVAL;
2023
                goto out;
2024
        }
2025
        if (incoming == 0) {
2026
                dprintk("vino_capture_next(): no buffers available\n");
2027
                goto out;
2028
        }
2029
 
2030
        fb = vino_queue_peek(&vcs->fb_queue, &id);
2031
        if (fb == NULL) {
2032
                dprintk("vino_capture_next(): vino_queue_peek() failed\n");
2033
                err = -EINVAL;
2034
                goto out;
2035
        }
2036
 
2037
        if (start) {
2038
                vcs->capturing = 1;
2039
        }
2040
 
2041
        spin_unlock_irqrestore(&vcs->capture_lock, flags);
2042
 
2043
        err = vino_capture(vcs, fb);
2044
 
2045
        return err;
2046
 
2047
out:
2048
        vcs->capturing = 0;
2049
        spin_unlock_irqrestore(&vcs->capture_lock, flags);
2050
 
2051
        return err;
2052
}
2053
 
2054
static inline int vino_is_capturing(struct vino_channel_settings *vcs)
2055
{
2056
        int ret;
2057
        unsigned long flags;
2058
 
2059
        spin_lock_irqsave(&vcs->capture_lock, flags);
2060
 
2061
        ret = vcs->capturing;
2062
 
2063
        spin_unlock_irqrestore(&vcs->capture_lock, flags);
2064
 
2065
        return ret;
2066
}
2067
 
2068
/* waits until a frame is captured */
2069
static int vino_wait_for_frame(struct vino_channel_settings *vcs)
2070
{
2071
        wait_queue_t wait;
2072
        int err = 0;
2073
 
2074
        dprintk("vino_wait_for_frame():\n");
2075
 
2076
        init_waitqueue_entry(&wait, current);
2077
        /* add ourselves into wait queue */
2078
        add_wait_queue(&vcs->fb_queue.frame_wait_queue, &wait);
2079
 
2080
        /* to ensure that schedule_timeout will return immediately
2081
         * if VINO interrupt was triggered meanwhile */
2082
        schedule_timeout_interruptible(msecs_to_jiffies(100));
2083
 
2084
        if (signal_pending(current))
2085
                err = -EINTR;
2086
 
2087
        remove_wait_queue(&vcs->fb_queue.frame_wait_queue, &wait);
2088
 
2089
        dprintk("vino_wait_for_frame(): waiting for frame %s\n",
2090
                err ? "failed" : "ok");
2091
 
2092
        return err;
2093
}
2094
 
2095
/* the function assumes that PAGE_SIZE % 4 == 0 */
2096
static void vino_convert_to_rgba(struct vino_framebuffer *fb) {
2097
        unsigned char *pageptr;
2098
        unsigned int page, i;
2099
        unsigned char a;
2100
 
2101
        for (page = 0; page < fb->desc_table.page_count; page++) {
2102
                pageptr = (unsigned char *)fb->desc_table.virtual[page];
2103
 
2104
                for (i = 0; i < PAGE_SIZE; i += 4) {
2105
                        a = pageptr[0];
2106
                        pageptr[0] = pageptr[3];
2107
                        pageptr[1] = pageptr[2];
2108
                        pageptr[2] = pageptr[1];
2109
                        pageptr[3] = a;
2110
                        pageptr += 4;
2111
                }
2112
        }
2113
}
2114
 
2115
/* checks if the buffer is in correct state and syncs data */
2116
static int vino_check_buffer(struct vino_channel_settings *vcs,
2117
                             struct vino_framebuffer *fb)
2118
{
2119
        int err = 0;
2120
        unsigned long flags;
2121
 
2122
        dprintk("vino_check_buffer():\n");
2123
 
2124
        spin_lock_irqsave(&fb->state_lock, flags);
2125
        switch (fb->state) {
2126
        case VINO_FRAMEBUFFER_IN_USE:
2127
                err = -EIO;
2128
                break;
2129
        case VINO_FRAMEBUFFER_READY:
2130
                vino_sync_buffer(fb);
2131
                fb->state = VINO_FRAMEBUFFER_UNUSED;
2132
                break;
2133
        default:
2134
                err = -EINVAL;
2135
        }
2136
        spin_unlock_irqrestore(&fb->state_lock, flags);
2137
 
2138
        if (!err) {
2139
                if (vino_pixel_conversion
2140
                    && (fb->data_format == VINO_DATA_FMT_RGB32)) {
2141
                        vino_convert_to_rgba(fb);
2142
                }
2143
        } else if (err && (err != -EINVAL)) {
2144
                dprintk("vino_check_buffer(): buffer not ready\n");
2145
 
2146
                spin_lock_irqsave(&vino_drvdata->vino_lock, flags);
2147
                vino_dma_stop(vcs);
2148
                vino_clear_interrupt(vcs);
2149
                spin_unlock_irqrestore(&vino_drvdata->vino_lock, flags);
2150
        }
2151
 
2152
        return err;
2153
}
2154
 
2155
/* forcefully terminates capture */
2156
static void vino_capture_stop(struct vino_channel_settings *vcs)
2157
{
2158
        unsigned int incoming = 0, outgoing = 0, id;
2159
        unsigned long flags, flags2;
2160
 
2161
        dprintk("vino_capture_stop():\n");
2162
 
2163
        spin_lock_irqsave(&vcs->capture_lock, flags);
2164
 
2165
        /* unset capturing to stop queue processing */
2166
        vcs->capturing = 0;
2167
 
2168
        spin_lock_irqsave(&vino_drvdata->vino_lock, flags2);
2169
 
2170
        vino_dma_stop(vcs);
2171
        vino_clear_interrupt(vcs);
2172
 
2173
        spin_unlock_irqrestore(&vino_drvdata->vino_lock, flags2);
2174
 
2175
        /* remove all items from the queue */
2176
        if (vino_queue_get_incoming(&vcs->fb_queue, &incoming)) {
2177
                dprintk("vino_capture_stop(): "
2178
                        "vino_queue_get_incoming() failed\n");
2179
                goto out;
2180
        }
2181
        while (incoming > 0) {
2182
                vino_queue_transfer(&vcs->fb_queue);
2183
 
2184
                if (vino_queue_get_incoming(&vcs->fb_queue, &incoming)) {
2185
                        dprintk("vino_capture_stop(): "
2186
                                "vino_queue_get_incoming() failed\n");
2187
                        goto out;
2188
                }
2189
        }
2190
 
2191
        if (vino_queue_get_outgoing(&vcs->fb_queue, &outgoing)) {
2192
                dprintk("vino_capture_stop(): "
2193
                        "vino_queue_get_outgoing() failed\n");
2194
                goto out;
2195
        }
2196
        while (outgoing > 0) {
2197
                vino_queue_remove(&vcs->fb_queue, &id);
2198
 
2199
                if (vino_queue_get_outgoing(&vcs->fb_queue, &outgoing)) {
2200
                        dprintk("vino_capture_stop(): "
2201
                                "vino_queue_get_outgoing() failed\n");
2202
                        goto out;
2203
                }
2204
        }
2205
 
2206
out:
2207
        spin_unlock_irqrestore(&vcs->capture_lock, flags);
2208
}
2209
 
2210
#if 0
2211
static int vino_capture_failed(struct vino_channel_settings *vcs)
2212
{
2213
        struct vino_framebuffer *fb;
2214
        unsigned long flags;
2215
        unsigned int i;
2216
        int ret;
2217
 
2218
        dprintk("vino_capture_failed():\n");
2219
 
2220
        spin_lock_irqsave(&vino_drvdata->vino_lock, flags);
2221
 
2222
        vino_dma_stop(vcs);
2223
        vino_clear_interrupt(vcs);
2224
 
2225
        spin_unlock_irqrestore(&vino_drvdata->vino_lock, flags);
2226
 
2227
        ret = vino_queue_get_incoming(&vcs->fb_queue, &i);
2228
        if (ret == VINO_QUEUE_ERROR) {
2229
                dprintk("vino_queue_get_incoming() failed\n");
2230
                return -EINVAL;
2231
        }
2232
        if (i == 0) {
2233
                /* no buffers to process */
2234
                return 0;
2235
        }
2236
 
2237
        fb = vino_queue_peek(&vcs->fb_queue, &i);
2238
        if (fb == NULL) {
2239
                dprintk("vino_queue_peek() failed\n");
2240
                return -EINVAL;
2241
        }
2242
 
2243
        spin_lock_irqsave(&fb->state_lock, flags);
2244
        if (fb->state == VINO_FRAMEBUFFER_IN_USE) {
2245
                fb->state = VINO_FRAMEBUFFER_UNUSED;
2246
                vino_queue_transfer(&vcs->fb_queue);
2247
                vino_queue_remove(&vcs->fb_queue, &i);
2248
                /* we should actually discard the newest frame,
2249
                 * but who cares ... */
2250
        }
2251
        spin_unlock_irqrestore(&fb->state_lock, flags);
2252
 
2253
        return 0;
2254
}
2255
#endif
2256
 
2257
static void vino_skip_frame(struct vino_channel_settings *vcs)
2258
{
2259
        struct vino_framebuffer *fb;
2260
        unsigned long flags;
2261
        unsigned int id;
2262
 
2263
        spin_lock_irqsave(&vcs->capture_lock, flags);
2264
        fb = vino_queue_peek(&vcs->fb_queue, &id);
2265
        if (!fb) {
2266
                spin_unlock_irqrestore(&vcs->capture_lock, flags);
2267
                dprintk("vino_skip_frame(): vino_queue_peek() failed!\n");
2268
                return;
2269
        }
2270
        spin_unlock_irqrestore(&vcs->capture_lock, flags);
2271
 
2272
        spin_lock_irqsave(&fb->state_lock, flags);
2273
        fb->state = VINO_FRAMEBUFFER_UNUSED;
2274
        spin_unlock_irqrestore(&fb->state_lock, flags);
2275
 
2276
        vino_capture_next(vcs, 0);
2277
}
2278
 
2279
static void vino_frame_done(struct vino_channel_settings *vcs)
2280
{
2281
        struct vino_framebuffer *fb;
2282
        unsigned long flags;
2283
 
2284
        spin_lock_irqsave(&vcs->capture_lock, flags);
2285
        fb = vino_queue_transfer(&vcs->fb_queue);
2286
        if (!fb) {
2287
                spin_unlock_irqrestore(&vcs->capture_lock, flags);
2288
                dprintk("vino_frame_done(): vino_queue_transfer() failed!\n");
2289
                return;
2290
        }
2291
        spin_unlock_irqrestore(&vcs->capture_lock, flags);
2292
 
2293
        fb->frame_counter = vcs->int_data.frame_counter;
2294
        memcpy(&fb->timestamp, &vcs->int_data.timestamp,
2295
               sizeof(struct timeval));
2296
 
2297
        spin_lock_irqsave(&fb->state_lock, flags);
2298
        if (fb->state == VINO_FRAMEBUFFER_IN_USE)
2299
                fb->state = VINO_FRAMEBUFFER_READY;
2300
        spin_unlock_irqrestore(&fb->state_lock, flags);
2301
 
2302
        wake_up(&vcs->fb_queue.frame_wait_queue);
2303
 
2304
        vino_capture_next(vcs, 0);
2305
}
2306
 
2307
static void vino_capture_tasklet(unsigned long channel) {
2308
        struct vino_channel_settings *vcs;
2309
 
2310
        vcs = (channel == VINO_CHANNEL_A)
2311
                ? &vino_drvdata->a : &vino_drvdata->b;
2312
 
2313
        if (vcs->int_data.skip)
2314
                vcs->int_data.skip_count++;
2315
 
2316
        if (vcs->int_data.skip && (vcs->int_data.skip_count
2317
                                   <= VINO_MAX_FRAME_SKIP_COUNT)) {
2318
                vino_skip_frame(vcs);
2319
        } else {
2320
                vcs->int_data.skip_count = 0;
2321
                vino_frame_done(vcs);
2322
        }
2323
}
2324
 
2325
static irqreturn_t vino_interrupt(int irq, void *dev_id)
2326
{
2327
        u32 ctrl, intr;
2328
        unsigned int fc_a, fc_b;
2329
        int handled_a = 0, skip_a = 0, done_a = 0;
2330
        int handled_b = 0, skip_b = 0, done_b = 0;
2331
 
2332
#ifdef VINO_DEBUG_INT
2333
        int loop = 0;
2334
        unsigned int line_count = vino->a.line_count,
2335
                page_index = vino->a.page_index,
2336
                field_counter = vino->a.field_counter,
2337
                start_desc_tbl = vino->a.start_desc_tbl,
2338
                next_4_desc = vino->a.next_4_desc;
2339
        unsigned int line_count_2,
2340
                page_index_2,
2341
                field_counter_2,
2342
                start_desc_tbl_2,
2343
                next_4_desc_2;
2344
#endif
2345
 
2346
        spin_lock(&vino_drvdata->vino_lock);
2347
 
2348
        while ((intr = vino->intr_status)) {
2349
                fc_a = vino->a.field_counter >> 1;
2350
                fc_b = vino->b.field_counter >> 1;
2351
 
2352
                /* handle error-interrupts in some special way ?
2353
                 * --> skips frames */
2354
                if (intr & VINO_INTSTAT_A) {
2355
                        if (intr & VINO_INTSTAT_A_EOF) {
2356
                                vino_drvdata->a.field++;
2357
                                if (vino_drvdata->a.field > 1) {
2358
                                        vino_dma_stop(&vino_drvdata->a);
2359
                                        vino_clear_interrupt(&vino_drvdata->a);
2360
                                        vino_drvdata->a.field = 0;
2361
                                        done_a = 1;
2362
                                } else {
2363
                                        if (vino->a.page_index
2364
                                            != vino_drvdata->a.line_size) {
2365
                                                vino->a.line_count = 0;
2366
                                                vino->a.page_index =
2367
                                                        vino_drvdata->
2368
                                                        a.line_size;
2369
                                                vino->a.next_4_desc =
2370
                                                        vino->a.start_desc_tbl;
2371
                                        }
2372
                                }
2373
                                dprintk("channel A end-of-field "
2374
                                        "interrupt: %04x\n", intr);
2375
                        } else {
2376
                                vino_dma_stop(&vino_drvdata->a);
2377
                                vino_clear_interrupt(&vino_drvdata->a);
2378
                                vino_drvdata->a.field = 0;
2379
                                skip_a = 1;
2380
                                dprintk("channel A error interrupt: %04x\n",
2381
                                        intr);
2382
                        }
2383
 
2384
#ifdef VINO_DEBUG_INT
2385
                        line_count_2 = vino->a.line_count;
2386
                        page_index_2 = vino->a.page_index;
2387
                        field_counter_2 = vino->a.field_counter;
2388
                        start_desc_tbl_2 = vino->a.start_desc_tbl;
2389
                        next_4_desc_2 = vino->a.next_4_desc;
2390
 
2391
                        printk("intr = %04x, loop = %d, field = %d\n",
2392
                               intr, loop, vino_drvdata->a.field);
2393
                        printk("1- line count = %04d, page index = %04d, "
2394
                               "start = %08x, next = %08x\n"
2395
                               "   fieldc = %d, framec = %d\n",
2396
                               line_count, page_index, start_desc_tbl,
2397
                               next_4_desc, field_counter, fc_a);
2398
                        printk("12-line count = %04d, page index = %04d, "
2399
                               "   start = %08x, next = %08x\n",
2400
                               line_count_2, page_index_2, start_desc_tbl_2,
2401
                               next_4_desc_2);
2402
 
2403
                        if (done_a)
2404
                                printk("\n");
2405
#endif
2406
                }
2407
 
2408
                if (intr & VINO_INTSTAT_B) {
2409
                        if (intr & VINO_INTSTAT_B_EOF) {
2410
                                vino_drvdata->b.field++;
2411
                                if (vino_drvdata->b.field > 1) {
2412
                                        vino_dma_stop(&vino_drvdata->b);
2413
                                        vino_clear_interrupt(&vino_drvdata->b);
2414
                                        vino_drvdata->b.field = 0;
2415
                                        done_b = 1;
2416
                                }
2417
                                dprintk("channel B end-of-field "
2418
                                        "interrupt: %04x\n", intr);
2419
                        } else {
2420
                                vino_dma_stop(&vino_drvdata->b);
2421
                                vino_clear_interrupt(&vino_drvdata->b);
2422
                                vino_drvdata->b.field = 0;
2423
                                skip_b = 1;
2424
                                dprintk("channel B error interrupt: %04x\n",
2425
                                        intr);
2426
                        }
2427
                }
2428
 
2429
                /* Always remember to clear interrupt status.
2430
                 * Disable VINO interrupts while we do this. */
2431
                ctrl = vino->control;
2432
                vino->control = ctrl & ~(VINO_CTRL_A_INT | VINO_CTRL_B_INT);
2433
                vino->intr_status = ~intr;
2434
                vino->control = ctrl;
2435
 
2436
                spin_unlock(&vino_drvdata->vino_lock);
2437
 
2438
                if ((!handled_a) && (done_a || skip_a)) {
2439
                        if (!skip_a) {
2440
                                do_gettimeofday(&vino_drvdata->
2441
                                                a.int_data.timestamp);
2442
                                vino_drvdata->a.int_data.frame_counter = fc_a;
2443
                        }
2444
                        vino_drvdata->a.int_data.skip = skip_a;
2445
 
2446
                        dprintk("channel A %s, interrupt: %d\n",
2447
                                skip_a ? "skipping frame" : "frame done",
2448
                                intr);
2449
                        tasklet_hi_schedule(&vino_tasklet_a);
2450
                        handled_a = 1;
2451
                }
2452
 
2453
                if ((!handled_b) && (done_b || skip_b)) {
2454
                        if (!skip_b) {
2455
                                do_gettimeofday(&vino_drvdata->
2456
                                                b.int_data.timestamp);
2457
                                vino_drvdata->b.int_data.frame_counter = fc_b;
2458
                        }
2459
                        vino_drvdata->b.int_data.skip = skip_b;
2460
 
2461
                        dprintk("channel B %s, interrupt: %d\n",
2462
                                skip_b ? "skipping frame" : "frame done",
2463
                                intr);
2464
                        tasklet_hi_schedule(&vino_tasklet_b);
2465
                        handled_b = 1;
2466
                }
2467
 
2468
#ifdef VINO_DEBUG_INT
2469
                loop++;
2470
#endif
2471
                spin_lock(&vino_drvdata->vino_lock);
2472
        }
2473
 
2474
        spin_unlock(&vino_drvdata->vino_lock);
2475
 
2476
        return IRQ_HANDLED;
2477
}
2478
 
2479
/* VINO video input management */
2480
 
2481
static int vino_get_saa7191_input(int input)
2482
{
2483
        switch (input) {
2484
        case VINO_INPUT_COMPOSITE:
2485
                return SAA7191_INPUT_COMPOSITE;
2486
        case VINO_INPUT_SVIDEO:
2487
                return SAA7191_INPUT_SVIDEO;
2488
        default:
2489
                printk(KERN_ERR "VINO: vino_get_saa7191_input(): "
2490
                       "invalid input!\n");
2491
                return -1;
2492
        }
2493
}
2494
 
2495
static int vino_get_saa7191_norm(unsigned int data_norm)
2496
{
2497
        switch (data_norm) {
2498
        case VINO_DATA_NORM_AUTO:
2499
                return SAA7191_NORM_AUTO;
2500
        case VINO_DATA_NORM_AUTO_EXT:
2501
                return SAA7191_NORM_AUTO_EXT;
2502
        case VINO_DATA_NORM_PAL:
2503
                return SAA7191_NORM_PAL;
2504
        case VINO_DATA_NORM_NTSC:
2505
                return SAA7191_NORM_NTSC;
2506
        case VINO_DATA_NORM_SECAM:
2507
                return SAA7191_NORM_SECAM;
2508
        default:
2509
                printk(KERN_ERR "VINO: vino_get_saa7191_norm(): "
2510
                       "invalid norm!\n");
2511
                return -1;
2512
        }
2513
}
2514
 
2515
static int vino_get_from_saa7191_norm(int saa7191_norm)
2516
{
2517
        switch (saa7191_norm) {
2518
        case SAA7191_NORM_PAL:
2519
                return VINO_DATA_NORM_PAL;
2520
        case SAA7191_NORM_NTSC:
2521
                return VINO_DATA_NORM_NTSC;
2522
        case SAA7191_NORM_SECAM:
2523
                return VINO_DATA_NORM_SECAM;
2524
        default:
2525
                printk(KERN_ERR "VINO: vino_get_from_saa7191_norm(): "
2526
                       "invalid norm!\n");
2527
                return VINO_DATA_NORM_NONE;
2528
        }
2529
}
2530
 
2531
static int vino_saa7191_set_norm(unsigned int *data_norm)
2532
{
2533
        int saa7191_norm, new_data_norm;
2534
        int err = 0;
2535
 
2536
        saa7191_norm = vino_get_saa7191_norm(*data_norm);
2537
 
2538
        err = i2c_decoder_command(DECODER_SAA7191_SET_NORM,
2539
                                  &saa7191_norm);
2540
        if (err)
2541
                goto out;
2542
 
2543
        if ((*data_norm == VINO_DATA_NORM_AUTO)
2544
            || (*data_norm == VINO_DATA_NORM_AUTO_EXT)) {
2545
                struct saa7191_status status;
2546
 
2547
                err = i2c_decoder_command(DECODER_SAA7191_GET_STATUS,
2548
                                          &status);
2549
                if (err)
2550
                        goto out;
2551
 
2552
                new_data_norm =
2553
                        vino_get_from_saa7191_norm(status.norm);
2554
                if (new_data_norm == VINO_DATA_NORM_NONE) {
2555
                        err = -EINVAL;
2556
                        goto out;
2557
                }
2558
 
2559
                *data_norm = (unsigned int)new_data_norm;
2560
        }
2561
 
2562
out:
2563
        return err;
2564
}
2565
 
2566
/* execute with input_lock locked */
2567
static int vino_is_input_owner(struct vino_channel_settings *vcs)
2568
{
2569
        switch(vcs->input) {
2570
        case VINO_INPUT_COMPOSITE:
2571
        case VINO_INPUT_SVIDEO:
2572
                return (vino_drvdata->decoder.owner == vcs->channel);
2573
        case VINO_INPUT_D1:
2574
                return (vino_drvdata->camera.owner == vcs->channel);
2575
        default:
2576
                return 0;
2577
        }
2578
}
2579
 
2580
static int vino_acquire_input(struct vino_channel_settings *vcs)
2581
{
2582
        unsigned long flags;
2583
        int ret = 0;
2584
 
2585
        dprintk("vino_acquire_input():\n");
2586
 
2587
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
2588
 
2589
        /* First try D1 and then SAA7191 */
2590
        if (vino_drvdata->camera.driver
2591
            && (vino_drvdata->camera.owner == VINO_NO_CHANNEL)) {
2592
                if (i2c_use_client(vino_drvdata->camera.driver)) {
2593
                        ret = -ENODEV;
2594
                        goto out;
2595
                }
2596
 
2597
                vino_drvdata->camera.owner = vcs->channel;
2598
                vcs->input = VINO_INPUT_D1;
2599
                vcs->data_norm = VINO_DATA_NORM_D1;
2600
        } else if (vino_drvdata->decoder.driver
2601
                   && (vino_drvdata->decoder.owner == VINO_NO_CHANNEL)) {
2602
                int input, data_norm;
2603
                int saa7191_input;
2604
 
2605
                if (i2c_use_client(vino_drvdata->decoder.driver)) {
2606
                        ret = -ENODEV;
2607
                        goto out;
2608
                }
2609
 
2610
                input = VINO_INPUT_COMPOSITE;
2611
 
2612
                saa7191_input = vino_get_saa7191_input(input);
2613
                ret = i2c_decoder_command(DECODER_SET_INPUT,
2614
                                          &saa7191_input);
2615
                if (ret) {
2616
                        ret = -EINVAL;
2617
                        goto out;
2618
                }
2619
 
2620
                spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
2621
 
2622
                /* Don't hold spinlocks while auto-detecting norm
2623
                 * as it may take a while... */
2624
 
2625
                data_norm = VINO_DATA_NORM_AUTO_EXT;
2626
 
2627
                ret = vino_saa7191_set_norm(&data_norm);
2628
                if ((ret == -EBUSY) || (ret == -EAGAIN)) {
2629
                        data_norm = VINO_DATA_NORM_PAL;
2630
                        ret = vino_saa7191_set_norm(&data_norm);
2631
                }
2632
 
2633
                spin_lock_irqsave(&vino_drvdata->input_lock, flags);
2634
 
2635
                if (ret) {
2636
                        ret = -EINVAL;
2637
                        goto out;
2638
                }
2639
 
2640
                vino_drvdata->decoder.owner = vcs->channel;
2641
 
2642
                vcs->input = input;
2643
                vcs->data_norm = data_norm;
2644
        } else {
2645
                vcs->input = (vcs->channel == VINO_CHANNEL_A) ?
2646
                        vino_drvdata->b.input : vino_drvdata->a.input;
2647
                vcs->data_norm = (vcs->channel == VINO_CHANNEL_A) ?
2648
                        vino_drvdata->b.data_norm : vino_drvdata->a.data_norm;
2649
        }
2650
 
2651
        if (vcs->input == VINO_INPUT_NONE) {
2652
                ret = -ENODEV;
2653
                goto out;
2654
        }
2655
 
2656
        vino_set_default_clipping(vcs);
2657
        vino_set_default_scaling(vcs);
2658
        vino_set_default_framerate(vcs);
2659
 
2660
        dprintk("vino_acquire_input(): %s\n", vino_inputs[vcs->input].name);
2661
 
2662
out:
2663
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
2664
 
2665
        return ret;
2666
}
2667
 
2668
static int vino_set_input(struct vino_channel_settings *vcs, int input)
2669
{
2670
        struct vino_channel_settings *vcs2 = (vcs->channel == VINO_CHANNEL_A) ?
2671
                &vino_drvdata->b : &vino_drvdata->a;
2672
        unsigned long flags;
2673
        int ret = 0;
2674
 
2675
        dprintk("vino_set_input():\n");
2676
 
2677
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
2678
 
2679
        if (vcs->input == input)
2680
                goto out;
2681
 
2682
        switch (input) {
2683
        case VINO_INPUT_COMPOSITE:
2684
        case VINO_INPUT_SVIDEO:
2685
                if (!vino_drvdata->decoder.driver) {
2686
                        ret = -EINVAL;
2687
                        goto out;
2688
                }
2689
 
2690
                if (vino_drvdata->decoder.owner == VINO_NO_CHANNEL) {
2691
                        if (i2c_use_client(vino_drvdata->decoder.driver)) {
2692
                                ret = -ENODEV;
2693
                                goto out;
2694
                        }
2695
                        vino_drvdata->decoder.owner = vcs->channel;
2696
                }
2697
 
2698
                if (vino_drvdata->decoder.owner == vcs->channel) {
2699
                        int data_norm;
2700
                        int saa7191_input;
2701
 
2702
                        saa7191_input = vino_get_saa7191_input(input);
2703
                        ret = i2c_decoder_command(DECODER_SET_INPUT,
2704
                                                  &saa7191_input);
2705
                        if (ret) {
2706
                                vino_drvdata->decoder.owner = VINO_NO_CHANNEL;
2707
                                ret = -EINVAL;
2708
                                goto out;
2709
                        }
2710
 
2711
                        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
2712
 
2713
                        /* Don't hold spinlocks while auto-detecting norm
2714
                         * as it may take a while... */
2715
 
2716
                        data_norm = VINO_DATA_NORM_AUTO_EXT;
2717
 
2718
                        ret = vino_saa7191_set_norm(&data_norm);
2719
                        if ((ret  == -EBUSY) || (ret == -EAGAIN)) {
2720
                                data_norm = VINO_DATA_NORM_PAL;
2721
                                ret = vino_saa7191_set_norm(&data_norm);
2722
                        }
2723
 
2724
                        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
2725
 
2726
                        if (ret) {
2727
                                vino_drvdata->decoder.owner = VINO_NO_CHANNEL;
2728
                                ret = -EINVAL;
2729
                                goto out;
2730
                        }
2731
 
2732
                        vcs->input = input;
2733
                        vcs->data_norm = data_norm;
2734
                } else {
2735
                        if (input != vcs2->input) {
2736
                                ret = -EBUSY;
2737
                                goto out;
2738
                        }
2739
 
2740
                        vcs->input = input;
2741
                        vcs->data_norm = vcs2->data_norm;
2742
                }
2743
 
2744
                if (vino_drvdata->camera.owner == vcs->channel) {
2745
                        /* Transfer the ownership or release the input */
2746
                        if (vcs2->input == VINO_INPUT_D1) {
2747
                                vino_drvdata->camera.owner = vcs2->channel;
2748
                        } else {
2749
                                i2c_release_client(vino_drvdata->
2750
                                                   camera.driver);
2751
                                vino_drvdata->camera.owner = VINO_NO_CHANNEL;
2752
                        }
2753
                }
2754
                break;
2755
        case VINO_INPUT_D1:
2756
                if (!vino_drvdata->camera.driver) {
2757
                        ret = -EINVAL;
2758
                        goto out;
2759
                }
2760
 
2761
                if (vino_drvdata->camera.owner == VINO_NO_CHANNEL) {
2762
                        if (i2c_use_client(vino_drvdata->camera.driver)) {
2763
                                ret = -ENODEV;
2764
                                goto out;
2765
                        }
2766
                        vino_drvdata->camera.owner = vcs->channel;
2767
                }
2768
 
2769
                if (vino_drvdata->decoder.owner == vcs->channel) {
2770
                        /* Transfer the ownership or release the input */
2771
                        if ((vcs2->input == VINO_INPUT_COMPOSITE) ||
2772
                                 (vcs2->input == VINO_INPUT_SVIDEO)) {
2773
                                vino_drvdata->decoder.owner = vcs2->channel;
2774
                        } else {
2775
                                i2c_release_client(vino_drvdata->
2776
                                                   decoder.driver);
2777
                                vino_drvdata->decoder.owner = VINO_NO_CHANNEL;
2778
                        }
2779
                }
2780
 
2781
                vcs->input = input;
2782
                vcs->data_norm = VINO_DATA_NORM_D1;
2783
                break;
2784
        default:
2785
                ret = -EINVAL;
2786
                goto out;
2787
        }
2788
 
2789
        vino_set_default_clipping(vcs);
2790
        vino_set_default_scaling(vcs);
2791
        vino_set_default_framerate(vcs);
2792
 
2793
        dprintk("vino_set_input(): %s\n", vino_inputs[vcs->input].name);
2794
 
2795
out:
2796
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
2797
 
2798
        return ret;
2799
}
2800
 
2801
static void vino_release_input(struct vino_channel_settings *vcs)
2802
{
2803
        struct vino_channel_settings *vcs2 = (vcs->channel == VINO_CHANNEL_A) ?
2804
                &vino_drvdata->b : &vino_drvdata->a;
2805
        unsigned long flags;
2806
 
2807
        dprintk("vino_release_input():\n");
2808
 
2809
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
2810
 
2811
        /* Release ownership of the channel
2812
         * and if the other channel takes input from
2813
         * the same source, transfer the ownership */
2814
        if (vino_drvdata->camera.owner == vcs->channel) {
2815
                if (vcs2->input == VINO_INPUT_D1) {
2816
                        vino_drvdata->camera.owner = vcs2->channel;
2817
                } else {
2818
                        i2c_release_client(vino_drvdata->camera.driver);
2819
                        vino_drvdata->camera.owner = VINO_NO_CHANNEL;
2820
                }
2821
        } else if (vino_drvdata->decoder.owner == vcs->channel) {
2822
                if ((vcs2->input == VINO_INPUT_COMPOSITE) ||
2823
                         (vcs2->input == VINO_INPUT_SVIDEO)) {
2824
                        vino_drvdata->decoder.owner = vcs2->channel;
2825
                } else {
2826
                        i2c_release_client(vino_drvdata->decoder.driver);
2827
                        vino_drvdata->decoder.owner = VINO_NO_CHANNEL;
2828
                }
2829
        }
2830
        vcs->input = VINO_INPUT_NONE;
2831
 
2832
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
2833
}
2834
 
2835
/* execute with input_lock locked */
2836
static int vino_set_data_norm(struct vino_channel_settings *vcs,
2837
                              unsigned int data_norm,
2838
                              unsigned long *flags)
2839
{
2840
        int err = 0;
2841
 
2842
        if (data_norm == vcs->data_norm)
2843
                return 0;
2844
 
2845
        switch (vcs->input) {
2846
        case VINO_INPUT_D1:
2847
                /* only one "norm" supported */
2848
                if ((data_norm != VINO_DATA_NORM_D1)
2849
                    && (data_norm != VINO_DATA_NORM_AUTO)
2850
                    && (data_norm != VINO_DATA_NORM_AUTO_EXT))
2851
                        return -EINVAL;
2852
                break;
2853
        case VINO_INPUT_COMPOSITE:
2854
        case VINO_INPUT_SVIDEO: {
2855
                if ((data_norm != VINO_DATA_NORM_PAL)
2856
                    && (data_norm != VINO_DATA_NORM_NTSC)
2857
                    && (data_norm != VINO_DATA_NORM_SECAM)
2858
                    && (data_norm != VINO_DATA_NORM_AUTO)
2859
                    && (data_norm != VINO_DATA_NORM_AUTO_EXT))
2860
                        return -EINVAL;
2861
 
2862
                spin_unlock_irqrestore(&vino_drvdata->input_lock, *flags);
2863
 
2864
                /* Don't hold spinlocks while setting norm
2865
                 * as it may take a while... */
2866
 
2867
                err = vino_saa7191_set_norm(&data_norm);
2868
 
2869
                spin_lock_irqsave(&vino_drvdata->input_lock, *flags);
2870
 
2871
                if (err)
2872
                        goto out;
2873
 
2874
                vcs->data_norm = data_norm;
2875
 
2876
                vino_set_default_clipping(vcs);
2877
                vino_set_default_scaling(vcs);
2878
                vino_set_default_framerate(vcs);
2879
                break;
2880
        }
2881
        default:
2882
                return -EINVAL;
2883
        }
2884
 
2885
out:
2886
        return err;
2887
}
2888
 
2889
/* V4L2 helper functions */
2890
 
2891
static int vino_find_data_format(__u32 pixelformat)
2892
{
2893
        int i;
2894
 
2895
        for (i = 0; i < VINO_DATA_FMT_COUNT; i++) {
2896
                if (vino_data_formats[i].pixelformat == pixelformat)
2897
                        return i;
2898
        }
2899
 
2900
        return VINO_DATA_FMT_NONE;
2901
}
2902
 
2903
static int vino_enum_data_norm(struct vino_channel_settings *vcs, __u32 index)
2904
{
2905
        int data_norm = VINO_DATA_NORM_NONE;
2906
        unsigned long flags;
2907
 
2908
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
2909
        switch(vcs->input) {
2910
        case VINO_INPUT_COMPOSITE:
2911
        case VINO_INPUT_SVIDEO:
2912
                if (index == 0) {
2913
                        data_norm = VINO_DATA_NORM_PAL;
2914
                } else if (index == 1) {
2915
                        data_norm = VINO_DATA_NORM_NTSC;
2916
                } else if (index == 2) {
2917
                        data_norm = VINO_DATA_NORM_SECAM;
2918
                }
2919
                break;
2920
        case VINO_INPUT_D1:
2921
                if (index == 0) {
2922
                        data_norm = VINO_DATA_NORM_D1;
2923
                }
2924
                break;
2925
        }
2926
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
2927
 
2928
        return data_norm;
2929
}
2930
 
2931
static int vino_enum_input(struct vino_channel_settings *vcs, __u32 index)
2932
{
2933
        int input = VINO_INPUT_NONE;
2934
        unsigned long flags;
2935
 
2936
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
2937
        if (vino_drvdata->decoder.driver && vino_drvdata->camera.driver) {
2938
                switch (index) {
2939
                case 0:
2940
                        input = VINO_INPUT_COMPOSITE;
2941
                        break;
2942
                case 1:
2943
                        input = VINO_INPUT_SVIDEO;
2944
                        break;
2945
                case 2:
2946
                        input = VINO_INPUT_D1;
2947
                        break;
2948
                }
2949
        } else if (vino_drvdata->decoder.driver) {
2950
                switch (index) {
2951
                case 0:
2952
                        input = VINO_INPUT_COMPOSITE;
2953
                        break;
2954
                case 1:
2955
                        input = VINO_INPUT_SVIDEO;
2956
                        break;
2957
                }
2958
        } else if (vino_drvdata->camera.driver) {
2959
                switch (index) {
2960
                case 0:
2961
                        input = VINO_INPUT_D1;
2962
                        break;
2963
                }
2964
        }
2965
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
2966
 
2967
        return input;
2968
}
2969
 
2970
/* execute with input_lock locked */
2971
static __u32 vino_find_input_index(struct vino_channel_settings *vcs)
2972
{
2973
        __u32 index = 0;
2974
        // FIXME: detect when no inputs available
2975
 
2976
        if (vino_drvdata->decoder.driver && vino_drvdata->camera.driver) {
2977
                switch (vcs->input) {
2978
                case VINO_INPUT_COMPOSITE:
2979
                        index = 0;
2980
                        break;
2981
                case VINO_INPUT_SVIDEO:
2982
                        index = 1;
2983
                        break;
2984
                case VINO_INPUT_D1:
2985
                        index = 2;
2986
                        break;
2987
                }
2988
        } else if (vino_drvdata->decoder.driver) {
2989
                switch (vcs->input) {
2990
                case VINO_INPUT_COMPOSITE:
2991
                        index = 0;
2992
                        break;
2993
                case VINO_INPUT_SVIDEO:
2994
                        index = 1;
2995
                        break;
2996
                }
2997
        } else if (vino_drvdata->camera.driver) {
2998
                switch (vcs->input) {
2999
                case VINO_INPUT_D1:
3000
                        index = 0;
3001
                        break;
3002
                }
3003
        }
3004
 
3005
        return index;
3006
}
3007
 
3008
/* V4L2 ioctls */
3009
 
3010
static void vino_v4l2_querycap(struct v4l2_capability *cap)
3011
{
3012
        memset(cap, 0, sizeof(struct v4l2_capability));
3013
 
3014
        strcpy(cap->driver, vino_driver_name);
3015
        strcpy(cap->card, vino_driver_description);
3016
        strcpy(cap->bus_info, vino_bus_name);
3017
        cap->version = VINO_VERSION_CODE;
3018
        cap->capabilities =
3019
                V4L2_CAP_VIDEO_CAPTURE |
3020
                V4L2_CAP_STREAMING;
3021
        // V4L2_CAP_OVERLAY, V4L2_CAP_READWRITE
3022
}
3023
 
3024
static int vino_v4l2_enuminput(struct vino_channel_settings *vcs,
3025
                               struct v4l2_input *i)
3026
{
3027
        __u32 index = i->index;
3028
        int input;
3029
        dprintk("requested index = %d\n", index);
3030
 
3031
        input = vino_enum_input(vcs, index);
3032
        if (input == VINO_INPUT_NONE)
3033
                return -EINVAL;
3034
 
3035
        memset(i, 0, sizeof(struct v4l2_input));
3036
 
3037
        i->index = index;
3038
        i->type = V4L2_INPUT_TYPE_CAMERA;
3039
        i->std = vino_inputs[input].std;
3040
        strcpy(i->name, vino_inputs[input].name);
3041
 
3042
        if ((input == VINO_INPUT_COMPOSITE)
3043
            || (input == VINO_INPUT_SVIDEO)) {
3044
                struct saa7191_status status;
3045
                i2c_decoder_command(DECODER_SAA7191_GET_STATUS, &status);
3046
                i->status |= status.signal ? 0 : V4L2_IN_ST_NO_SIGNAL;
3047
                i->status |= status.color ? 0 : V4L2_IN_ST_NO_COLOR;
3048
        }
3049
 
3050
        return 0;
3051
}
3052
 
3053
static int vino_v4l2_g_input(struct vino_channel_settings *vcs,
3054
                             unsigned int *i)
3055
{
3056
        __u32 index;
3057
        int input;
3058
        unsigned long flags;
3059
 
3060
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3061
        input = vcs->input;
3062
        index = vino_find_input_index(vcs);
3063
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3064
 
3065
        dprintk("input = %d\n", input);
3066
 
3067
        if (input == VINO_INPUT_NONE) {
3068
                return -EINVAL;
3069
        }
3070
 
3071
        *i = index;
3072
 
3073
        return 0;
3074
}
3075
 
3076
static int vino_v4l2_s_input(struct vino_channel_settings *vcs,
3077
                             unsigned int *i)
3078
{
3079
        int input;
3080
        dprintk("requested input = %d\n", *i);
3081
 
3082
        input = vino_enum_input(vcs, *i);
3083
        if (input == VINO_INPUT_NONE)
3084
                return -EINVAL;
3085
 
3086
        return vino_set_input(vcs, input);
3087
}
3088
 
3089
static int vino_v4l2_enumstd(struct vino_channel_settings *vcs,
3090
                             struct v4l2_standard *s)
3091
{
3092
        int index = s->index;
3093
        int data_norm;
3094
 
3095
        data_norm = vino_enum_data_norm(vcs, index);
3096
        dprintk("standard index = %d\n", index);
3097
 
3098
        if (data_norm == VINO_DATA_NORM_NONE)
3099
                return -EINVAL;
3100
 
3101
        dprintk("standard name = %s\n",
3102
               vino_data_norms[data_norm].description);
3103
 
3104
        memset(s, 0, sizeof(struct v4l2_standard));
3105
        s->index = index;
3106
 
3107
        s->id = vino_data_norms[data_norm].std;
3108
        s->frameperiod.numerator = 1;
3109
        s->frameperiod.denominator =
3110
                vino_data_norms[data_norm].fps_max;
3111
        s->framelines =
3112
                vino_data_norms[data_norm].framelines;
3113
        strcpy(s->name,
3114
               vino_data_norms[data_norm].description);
3115
 
3116
        return 0;
3117
}
3118
 
3119
static int vino_v4l2_querystd(struct vino_channel_settings *vcs,
3120
                              v4l2_std_id *std)
3121
{
3122
        unsigned long flags;
3123
        int err = 0;
3124
 
3125
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3126
 
3127
        switch (vcs->input) {
3128
        case VINO_INPUT_D1:
3129
                *std = vino_inputs[vcs->input].std;
3130
                break;
3131
        case VINO_INPUT_COMPOSITE:
3132
        case VINO_INPUT_SVIDEO: {
3133
                struct saa7191_status status;
3134
 
3135
                i2c_decoder_command(DECODER_SAA7191_GET_STATUS, &status);
3136
 
3137
                if (status.signal) {
3138
                        if (status.signal_60hz) {
3139
                                *std = V4L2_STD_NTSC;
3140
                        } else {
3141
                                *std = V4L2_STD_PAL | V4L2_STD_SECAM;
3142
                        }
3143
                } else {
3144
                        *std = vino_inputs[vcs->input].std;
3145
                }
3146
                break;
3147
        }
3148
        default:
3149
                err = -EINVAL;
3150
        }
3151
 
3152
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3153
 
3154
        return err;
3155
}
3156
 
3157
static int vino_v4l2_g_std(struct vino_channel_settings *vcs,
3158
                           v4l2_std_id *std)
3159
{
3160
        unsigned long flags;
3161
 
3162
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3163
 
3164
        *std = vino_data_norms[vcs->data_norm].std;
3165
        dprintk("current standard = %d\n", vcs->data_norm);
3166
 
3167
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3168
 
3169
        return 0;
3170
}
3171
 
3172
static int vino_v4l2_s_std(struct vino_channel_settings *vcs,
3173
                           v4l2_std_id *std)
3174
{
3175
        unsigned long flags;
3176
        int ret = 0;
3177
 
3178
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3179
 
3180
        if (!vino_is_input_owner(vcs)) {
3181
                ret = -EBUSY;
3182
                goto out;
3183
        }
3184
 
3185
        /* check if the standard is valid for the current input */
3186
        if ((*std) & vino_inputs[vcs->input].std) {
3187
                dprintk("standard accepted\n");
3188
 
3189
                /* change the video norm for SAA7191
3190
                 * and accept NTSC for D1 (do nothing) */
3191
 
3192
                if (vcs->input == VINO_INPUT_D1)
3193
                        goto out;
3194
 
3195
                if (((*std) & V4L2_STD_PAL)
3196
                    && ((*std) & V4L2_STD_NTSC)
3197
                    && ((*std) & V4L2_STD_SECAM)) {
3198
                        ret = vino_set_data_norm(vcs, VINO_DATA_NORM_AUTO_EXT,
3199
                                                 &flags);
3200
                } else if ((*std) & V4L2_STD_PAL) {
3201
                        ret = vino_set_data_norm(vcs, VINO_DATA_NORM_PAL,
3202
                                                 &flags);
3203
                } else if ((*std) & V4L2_STD_NTSC) {
3204
                        ret = vino_set_data_norm(vcs, VINO_DATA_NORM_NTSC,
3205
                                                 &flags);
3206
                } else if ((*std) & V4L2_STD_SECAM) {
3207
                        ret = vino_set_data_norm(vcs, VINO_DATA_NORM_SECAM,
3208
                                                 &flags);
3209
                } else {
3210
                        ret = -EINVAL;
3211
                }
3212
 
3213
                if (ret) {
3214
                        ret = -EINVAL;
3215
                }
3216
        } else {
3217
                ret = -EINVAL;
3218
        }
3219
 
3220
out:
3221
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3222
 
3223
        return ret;
3224
}
3225
 
3226
static int vino_v4l2_enum_fmt(struct vino_channel_settings *vcs,
3227
                              struct v4l2_fmtdesc *fd)
3228
{
3229
        enum v4l2_buf_type type = fd->type;
3230
        int index = fd->index;
3231
        dprintk("format index = %d\n", index);
3232
 
3233
        switch (fd->type) {
3234
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
3235
                if ((fd->index < 0) ||
3236
                    (fd->index >= VINO_DATA_FMT_COUNT))
3237
                        return -EINVAL;
3238
                dprintk("format name = %s\n",
3239
                       vino_data_formats[index].description);
3240
 
3241
                memset(fd, 0, sizeof(struct v4l2_fmtdesc));
3242
                fd->index = index;
3243
                fd->type = type;
3244
                fd->pixelformat = vino_data_formats[index].pixelformat;
3245
                strcpy(fd->description, vino_data_formats[index].description);
3246
                break;
3247
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3248
        default:
3249
                return -EINVAL;
3250
        }
3251
 
3252
        return 0;
3253
}
3254
 
3255
static int vino_v4l2_try_fmt(struct vino_channel_settings *vcs,
3256
                             struct v4l2_format *f)
3257
{
3258
        struct vino_channel_settings tempvcs;
3259
        unsigned long flags;
3260
 
3261
        switch (f->type) {
3262
        case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
3263
                struct v4l2_pix_format *pf = &f->fmt.pix;
3264
 
3265
                dprintk("requested: w = %d, h = %d\n",
3266
                       pf->width, pf->height);
3267
 
3268
                spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3269
                memcpy(&tempvcs, vcs, sizeof(struct vino_channel_settings));
3270
                spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3271
 
3272
                tempvcs.data_format = vino_find_data_format(pf->pixelformat);
3273
                if (tempvcs.data_format == VINO_DATA_FMT_NONE) {
3274
                        tempvcs.data_format = VINO_DATA_FMT_GREY;
3275
                        pf->pixelformat =
3276
                                vino_data_formats[tempvcs.data_format].
3277
                                pixelformat;
3278
                }
3279
 
3280
                /* data format must be set before clipping/scaling */
3281
                vino_set_scaling(&tempvcs, pf->width, pf->height);
3282
 
3283
                dprintk("data format = %s\n",
3284
                       vino_data_formats[tempvcs.data_format].description);
3285
 
3286
                pf->width = (tempvcs.clipping.right - tempvcs.clipping.left) /
3287
                        tempvcs.decimation;
3288
                pf->height = (tempvcs.clipping.bottom - tempvcs.clipping.top) /
3289
                        tempvcs.decimation;
3290
 
3291
                pf->field = V4L2_FIELD_INTERLACED;
3292
                pf->bytesperline = tempvcs.line_size;
3293
                pf->sizeimage = tempvcs.line_size *
3294
                        (tempvcs.clipping.bottom - tempvcs.clipping.top) /
3295
                        tempvcs.decimation;
3296
                pf->colorspace =
3297
                        vino_data_formats[tempvcs.data_format].colorspace;
3298
 
3299
                pf->priv = 0;
3300
                break;
3301
        }
3302
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3303
        default:
3304
                return -EINVAL;
3305
        }
3306
 
3307
        return 0;
3308
}
3309
 
3310
static int vino_v4l2_g_fmt(struct vino_channel_settings *vcs,
3311
                           struct v4l2_format *f)
3312
{
3313
        unsigned long flags;
3314
 
3315
        switch (f->type) {
3316
        case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
3317
                struct v4l2_pix_format *pf = &f->fmt.pix;
3318
 
3319
                spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3320
 
3321
                pf->width = (vcs->clipping.right - vcs->clipping.left) /
3322
                        vcs->decimation;
3323
                pf->height = (vcs->clipping.bottom - vcs->clipping.top) /
3324
                        vcs->decimation;
3325
                pf->pixelformat =
3326
                        vino_data_formats[vcs->data_format].pixelformat;
3327
 
3328
                pf->field = V4L2_FIELD_INTERLACED;
3329
                pf->bytesperline = vcs->line_size;
3330
                pf->sizeimage = vcs->line_size *
3331
                        (vcs->clipping.bottom - vcs->clipping.top) /
3332
                        vcs->decimation;
3333
                pf->colorspace =
3334
                        vino_data_formats[vcs->data_format].colorspace;
3335
 
3336
                pf->priv = 0;
3337
 
3338
                spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3339
                break;
3340
        }
3341
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3342
        default:
3343
                return -EINVAL;
3344
        }
3345
 
3346
        return 0;
3347
}
3348
 
3349
static int vino_v4l2_s_fmt(struct vino_channel_settings *vcs,
3350
                           struct v4l2_format *f)
3351
{
3352
        int data_format;
3353
        unsigned long flags;
3354
 
3355
        switch (f->type) {
3356
        case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
3357
                struct v4l2_pix_format *pf = &f->fmt.pix;
3358
 
3359
                spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3360
 
3361
                data_format = vino_find_data_format(pf->pixelformat);
3362
 
3363
                if (data_format == VINO_DATA_FMT_NONE) {
3364
                        vcs->data_format = VINO_DATA_FMT_GREY;
3365
                        pf->pixelformat =
3366
                                vino_data_formats[vcs->data_format].
3367
                                pixelformat;
3368
                } else {
3369
                        vcs->data_format = data_format;
3370
                }
3371
 
3372
                /* data format must be set before clipping/scaling */
3373
                vino_set_scaling(vcs, pf->width, pf->height);
3374
 
3375
                dprintk("data format = %s\n",
3376
                       vino_data_formats[vcs->data_format].description);
3377
 
3378
                pf->width = vcs->clipping.right - vcs->clipping.left;
3379
                pf->height = vcs->clipping.bottom - vcs->clipping.top;
3380
 
3381
                pf->field = V4L2_FIELD_INTERLACED;
3382
                pf->bytesperline = vcs->line_size;
3383
                pf->sizeimage = vcs->line_size *
3384
                        (vcs->clipping.bottom - vcs->clipping.top) /
3385
                        vcs->decimation;
3386
                pf->colorspace =
3387
                        vino_data_formats[vcs->data_format].colorspace;
3388
 
3389
                pf->priv = 0;
3390
 
3391
                spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3392
                break;
3393
        }
3394
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3395
        default:
3396
                return -EINVAL;
3397
        }
3398
 
3399
        return 0;
3400
}
3401
 
3402
static int vino_v4l2_cropcap(struct vino_channel_settings *vcs,
3403
                             struct v4l2_cropcap *ccap)
3404
{
3405
        const struct vino_data_norm *norm;
3406
        unsigned long flags;
3407
 
3408
        switch (ccap->type) {
3409
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
3410
                spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3411
 
3412
                norm = &vino_data_norms[vcs->data_norm];
3413
 
3414
                spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3415
 
3416
                ccap->bounds.left = 0;
3417
                ccap->bounds.top = 0;
3418
                ccap->bounds.width = norm->width;
3419
                ccap->bounds.height = norm->height;
3420
                memcpy(&ccap->defrect, &ccap->bounds,
3421
                       sizeof(struct v4l2_rect));
3422
 
3423
                ccap->pixelaspect.numerator = 1;
3424
                ccap->pixelaspect.denominator = 1;
3425
                break;
3426
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3427
        default:
3428
                return -EINVAL;
3429
        }
3430
 
3431
        return 0;
3432
}
3433
 
3434
static int vino_v4l2_g_crop(struct vino_channel_settings *vcs,
3435
                            struct v4l2_crop *c)
3436
{
3437
        unsigned long flags;
3438
 
3439
        switch (c->type) {
3440
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
3441
                spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3442
 
3443
                c->c.left = vcs->clipping.left;
3444
                c->c.top = vcs->clipping.top;
3445
                c->c.width = vcs->clipping.right - vcs->clipping.left;
3446
                c->c.height = vcs->clipping.bottom - vcs->clipping.top;
3447
 
3448
                spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3449
                break;
3450
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3451
        default:
3452
                return -EINVAL;
3453
        }
3454
 
3455
        return 0;
3456
}
3457
 
3458
static int vino_v4l2_s_crop(struct vino_channel_settings *vcs,
3459
                            struct v4l2_crop *c)
3460
{
3461
        unsigned long flags;
3462
 
3463
        switch (c->type) {
3464
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
3465
                spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3466
 
3467
                vino_set_clipping(vcs, c->c.left, c->c.top,
3468
                                  c->c.width, c->c.height);
3469
 
3470
                spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3471
                break;
3472
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3473
        default:
3474
                return -EINVAL;
3475
        }
3476
 
3477
        return 0;
3478
}
3479
 
3480
static int vino_v4l2_g_parm(struct vino_channel_settings *vcs,
3481
                            struct v4l2_streamparm *sp)
3482
{
3483
        unsigned long flags;
3484
 
3485
        switch (sp->type) {
3486
        case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
3487
                struct v4l2_captureparm *cp = &sp->parm.capture;
3488
                memset(cp, 0, sizeof(struct v4l2_captureparm));
3489
 
3490
                cp->capability = V4L2_CAP_TIMEPERFRAME;
3491
                cp->timeperframe.numerator = 1;
3492
 
3493
                spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3494
 
3495
                cp->timeperframe.denominator = vcs->fps;
3496
 
3497
                spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3498
 
3499
                // TODO: cp->readbuffers = xxx;
3500
                break;
3501
        }
3502
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3503
        default:
3504
                return -EINVAL;
3505
        }
3506
 
3507
        return 0;
3508
}
3509
 
3510
static int vino_v4l2_s_parm(struct vino_channel_settings *vcs,
3511
                            struct v4l2_streamparm *sp)
3512
{
3513
        unsigned long flags;
3514
 
3515
        switch (sp->type) {
3516
        case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
3517
                struct v4l2_captureparm *cp = &sp->parm.capture;
3518
 
3519
                spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3520
 
3521
                if ((cp->timeperframe.numerator == 0) ||
3522
                    (cp->timeperframe.denominator == 0)) {
3523
                        /* reset framerate */
3524
                        vino_set_default_framerate(vcs);
3525
                } else {
3526
                        vino_set_framerate(vcs, cp->timeperframe.denominator /
3527
                                           cp->timeperframe.numerator);
3528
                }
3529
 
3530
                spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3531
 
3532
                // TODO: set buffers according to cp->readbuffers
3533
                break;
3534
        }
3535
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3536
        default:
3537
                return -EINVAL;
3538
        }
3539
 
3540
        return 0;
3541
}
3542
 
3543
static int vino_v4l2_reqbufs(struct vino_channel_settings *vcs,
3544
                             struct v4l2_requestbuffers *rb)
3545
{
3546
        if (vcs->reading)
3547
                return -EBUSY;
3548
 
3549
        switch (rb->type) {
3550
        case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
3551
                // TODO: check queue type
3552
                if (rb->memory != V4L2_MEMORY_MMAP) {
3553
                        dprintk("type not mmap\n");
3554
                        return -EINVAL;
3555
                }
3556
 
3557
                dprintk("count = %d\n", rb->count);
3558
                if (rb->count > 0) {
3559
                        if (vino_is_capturing(vcs)) {
3560
                                dprintk("busy, capturing\n");
3561
                                return -EBUSY;
3562
                        }
3563
 
3564
                        if (vino_queue_has_mapped_buffers(&vcs->fb_queue)) {
3565
                                dprintk("busy, buffers still mapped\n");
3566
                                return -EBUSY;
3567
                        } else {
3568
                                vcs->streaming = 0;
3569
                                vino_queue_free(&vcs->fb_queue);
3570
                                vino_queue_init(&vcs->fb_queue, &rb->count);
3571
                        }
3572
                } else {
3573
                        vcs->streaming = 0;
3574
                        vino_capture_stop(vcs);
3575
                        vino_queue_free(&vcs->fb_queue);
3576
                }
3577
                break;
3578
        }
3579
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3580
        default:
3581
                return -EINVAL;
3582
        }
3583
 
3584
        return 0;
3585
}
3586
 
3587
static void vino_v4l2_get_buffer_status(struct vino_channel_settings *vcs,
3588
                                        struct vino_framebuffer *fb,
3589
                                        struct v4l2_buffer *b)
3590
{
3591
        if (vino_queue_outgoing_contains(&vcs->fb_queue,
3592
                                         fb->id)) {
3593
                b->flags &= ~V4L2_BUF_FLAG_QUEUED;
3594
                b->flags |= V4L2_BUF_FLAG_DONE;
3595
        } else if (vino_queue_incoming_contains(&vcs->fb_queue,
3596
                                       fb->id)) {
3597
                b->flags &= ~V4L2_BUF_FLAG_DONE;
3598
                b->flags |= V4L2_BUF_FLAG_QUEUED;
3599
        } else {
3600
                b->flags &= ~(V4L2_BUF_FLAG_DONE |
3601
                              V4L2_BUF_FLAG_QUEUED);
3602
        }
3603
 
3604
        b->flags &= ~(V4L2_BUF_FLAG_TIMECODE);
3605
 
3606
        if (fb->map_count > 0)
3607
                b->flags |= V4L2_BUF_FLAG_MAPPED;
3608
 
3609
        b->index = fb->id;
3610
        b->memory = (vcs->fb_queue.type == VINO_MEMORY_MMAP) ?
3611
                V4L2_MEMORY_MMAP : V4L2_MEMORY_USERPTR;
3612
        b->m.offset = fb->offset;
3613
        b->bytesused = fb->data_size;
3614
        b->length = fb->size;
3615
        b->field = V4L2_FIELD_INTERLACED;
3616
        b->sequence = fb->frame_counter;
3617
        memcpy(&b->timestamp, &fb->timestamp,
3618
               sizeof(struct timeval));
3619
        // b->input ?
3620
 
3621
        dprintk("buffer %d: length = %d, bytesused = %d, offset = %d\n",
3622
                fb->id, fb->size, fb->data_size, fb->offset);
3623
}
3624
 
3625
static int vino_v4l2_querybuf(struct vino_channel_settings *vcs,
3626
                              struct v4l2_buffer *b)
3627
{
3628
        if (vcs->reading)
3629
                return -EBUSY;
3630
 
3631
        switch (b->type) {
3632
        case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
3633
                struct vino_framebuffer *fb;
3634
 
3635
                // TODO: check queue type
3636
                if (b->index >= vino_queue_get_length(&vcs->fb_queue)) {
3637
                        dprintk("invalid index = %d\n",
3638
                               b->index);
3639
                        return -EINVAL;
3640
                }
3641
 
3642
                fb = vino_queue_get_buffer(&vcs->fb_queue,
3643
                                           b->index);
3644
                if (fb == NULL) {
3645
                        dprintk("vino_queue_get_buffer() failed");
3646
                        return -EINVAL;
3647
                }
3648
 
3649
                vino_v4l2_get_buffer_status(vcs, fb, b);
3650
                break;
3651
        }
3652
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3653
        default:
3654
                return -EINVAL;
3655
        }
3656
 
3657
        return 0;
3658
}
3659
 
3660
static int vino_v4l2_qbuf(struct vino_channel_settings *vcs,
3661
                          struct v4l2_buffer *b)
3662
{
3663
        if (vcs->reading)
3664
                return -EBUSY;
3665
 
3666
        switch (b->type) {
3667
        case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
3668
                struct vino_framebuffer *fb;
3669
                int ret;
3670
 
3671
                // TODO: check queue type
3672
                if (b->memory != V4L2_MEMORY_MMAP) {
3673
                        dprintk("type not mmap\n");
3674
                        return -EINVAL;
3675
                }
3676
 
3677
                fb = vino_capture_enqueue(vcs, b->index);
3678
                if (fb == NULL)
3679
                        return -EINVAL;
3680
 
3681
                vino_v4l2_get_buffer_status(vcs, fb, b);
3682
 
3683
                if (vcs->streaming) {
3684
                        ret = vino_capture_next(vcs, 1);
3685
                        if (ret)
3686
                                return ret;
3687
                }
3688
                break;
3689
        }
3690
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3691
        default:
3692
                return -EINVAL;
3693
        }
3694
 
3695
        return 0;
3696
}
3697
 
3698
static int vino_v4l2_dqbuf(struct vino_channel_settings *vcs,
3699
                           struct v4l2_buffer *b,
3700
                           unsigned int nonblocking)
3701
{
3702
        if (vcs->reading)
3703
                return -EBUSY;
3704
 
3705
        switch (b->type) {
3706
        case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
3707
                struct vino_framebuffer *fb;
3708
                unsigned int incoming, outgoing;
3709
                int err;
3710
 
3711
                // TODO: check queue type
3712
 
3713
                err = vino_queue_get_incoming(&vcs->fb_queue, &incoming);
3714
                if (err) {
3715
                        dprintk("vino_queue_get_incoming() failed\n");
3716
                        return -EINVAL;
3717
                }
3718
                err = vino_queue_get_outgoing(&vcs->fb_queue, &outgoing);
3719
                if (err) {
3720
                        dprintk("vino_queue_get_outgoing() failed\n");
3721
                        return -EINVAL;
3722
                }
3723
 
3724
                dprintk("incoming = %d, outgoing = %d\n", incoming, outgoing);
3725
 
3726
                if (outgoing == 0) {
3727
                        if (incoming == 0) {
3728
                                dprintk("no incoming or outgoing buffers\n");
3729
                                return -EINVAL;
3730
                        }
3731
                        if (nonblocking) {
3732
                                dprintk("non-blocking I/O was selected and "
3733
                                        "there are no buffers to dequeue\n");
3734
                                return -EAGAIN;
3735
                        }
3736
 
3737
                        err = vino_wait_for_frame(vcs);
3738
                        if (err) {
3739
                                err = vino_wait_for_frame(vcs);
3740
                                if (err) {
3741
                                        /* interrupted or
3742
                                         * no frames captured because
3743
                                         * of frame skipping */
3744
                                        // vino_capture_failed(vcs);
3745
                                        return -EIO;
3746
                                }
3747
                        }
3748
                }
3749
 
3750
                fb = vino_queue_remove(&vcs->fb_queue, &b->index);
3751
                if (fb == NULL) {
3752
                        dprintk("vino_queue_remove() failed\n");
3753
                        return -EINVAL;
3754
                }
3755
 
3756
                err = vino_check_buffer(vcs, fb);
3757
 
3758
                vino_v4l2_get_buffer_status(vcs, fb, b);
3759
 
3760
                if (err)
3761
                        return -EIO;
3762
 
3763
                break;
3764
        }
3765
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
3766
        default:
3767
                return -EINVAL;
3768
        }
3769
 
3770
        return 0;
3771
}
3772
 
3773
static int vino_v4l2_streamon(struct vino_channel_settings *vcs)
3774
{
3775
        unsigned int incoming;
3776
        int ret;
3777
        if (vcs->reading)
3778
                return -EBUSY;
3779
 
3780
        if (vcs->streaming)
3781
                return 0;
3782
 
3783
        // TODO: check queue type
3784
 
3785
        if (vino_queue_get_length(&vcs->fb_queue) < 1) {
3786
                dprintk("no buffers allocated\n");
3787
                return -EINVAL;
3788
        }
3789
 
3790
        ret = vino_queue_get_incoming(&vcs->fb_queue, &incoming);
3791
        if (ret) {
3792
                dprintk("vino_queue_get_incoming() failed\n");
3793
                return -EINVAL;
3794
        }
3795
 
3796
        vcs->streaming = 1;
3797
 
3798
        if (incoming > 0) {
3799
                ret = vino_capture_next(vcs, 1);
3800
                if (ret) {
3801
                        vcs->streaming = 0;
3802
 
3803
                        dprintk("couldn't start capture\n");
3804
                        return -EINVAL;
3805
                }
3806
        }
3807
 
3808
        return 0;
3809
}
3810
 
3811
static int vino_v4l2_streamoff(struct vino_channel_settings *vcs)
3812
{
3813
        if (vcs->reading)
3814
                return -EBUSY;
3815
 
3816
        if (!vcs->streaming)
3817
                return 0;
3818
 
3819
        vcs->streaming = 0;
3820
        vino_capture_stop(vcs);
3821
 
3822
        return 0;
3823
}
3824
 
3825
static int vino_v4l2_queryctrl(struct vino_channel_settings *vcs,
3826
                               struct v4l2_queryctrl *queryctrl)
3827
{
3828
        unsigned long flags;
3829
        int i;
3830
        int err = 0;
3831
 
3832
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3833
 
3834
        switch (vcs->input) {
3835
        case VINO_INPUT_D1:
3836
                for (i = 0; i < VINO_INDYCAM_V4L2_CONTROL_COUNT; i++) {
3837
                        if (vino_indycam_v4l2_controls[i].id ==
3838
                            queryctrl->id) {
3839
                                memcpy(queryctrl,
3840
                                       &vino_indycam_v4l2_controls[i],
3841
                                       sizeof(struct v4l2_queryctrl));
3842
                                queryctrl->reserved[0] = 0;
3843
                                goto found;
3844
                        }
3845
                }
3846
 
3847
                err =  -EINVAL;
3848
                break;
3849
        case VINO_INPUT_COMPOSITE:
3850
        case VINO_INPUT_SVIDEO:
3851
                for (i = 0; i < VINO_SAA7191_V4L2_CONTROL_COUNT; i++) {
3852
                        if (vino_saa7191_v4l2_controls[i].id ==
3853
                            queryctrl->id) {
3854
                                memcpy(queryctrl,
3855
                                       &vino_saa7191_v4l2_controls[i],
3856
                                       sizeof(struct v4l2_queryctrl));
3857
                                queryctrl->reserved[0] = 0;
3858
                                goto found;
3859
                        }
3860
                }
3861
 
3862
                err =  -EINVAL;
3863
                break;
3864
        default:
3865
                err =  -EINVAL;
3866
        }
3867
 
3868
 found:
3869
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3870
 
3871
        return err;
3872
}
3873
 
3874
static int vino_v4l2_g_ctrl(struct vino_channel_settings *vcs,
3875
                            struct v4l2_control *control)
3876
{
3877
        unsigned long flags;
3878
        int i;
3879
        int err = 0;
3880
 
3881
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3882
 
3883
        switch (vcs->input) {
3884
        case VINO_INPUT_D1: {
3885
                struct indycam_control indycam_ctrl;
3886
 
3887
                for (i = 0; i < VINO_INDYCAM_V4L2_CONTROL_COUNT; i++) {
3888
                        if (vino_indycam_v4l2_controls[i].id ==
3889
                            control->id) {
3890
                                goto found1;
3891
                        }
3892
                }
3893
 
3894
                err = -EINVAL;
3895
                goto out;
3896
 
3897
found1:
3898
                indycam_ctrl.type = vino_indycam_v4l2_controls[i].reserved[0];
3899
 
3900
                err = i2c_camera_command(DECODER_INDYCAM_GET_CONTROL,
3901
                                         &indycam_ctrl);
3902
                if (err) {
3903
                        err = -EINVAL;
3904
                        goto out;
3905
                }
3906
 
3907
                control->value = indycam_ctrl.value;
3908
                break;
3909
        }
3910
        case VINO_INPUT_COMPOSITE:
3911
        case VINO_INPUT_SVIDEO: {
3912
                struct saa7191_control saa7191_ctrl;
3913
 
3914
                for (i = 0; i < VINO_SAA7191_V4L2_CONTROL_COUNT; i++) {
3915
                        if (vino_saa7191_v4l2_controls[i].id ==
3916
                            control->id) {
3917
                                goto found2;
3918
                        }
3919
                }
3920
 
3921
                err = -EINVAL;
3922
                goto out;
3923
 
3924
found2:
3925
                saa7191_ctrl.type = vino_saa7191_v4l2_controls[i].reserved[0];
3926
 
3927
                err = i2c_decoder_command(DECODER_SAA7191_GET_CONTROL,
3928
                                          &saa7191_ctrl);
3929
                if (err) {
3930
                        err = -EINVAL;
3931
                        goto out;
3932
                }
3933
 
3934
                control->value = saa7191_ctrl.value;
3935
                break;
3936
        }
3937
        default:
3938
                err =  -EINVAL;
3939
        }
3940
 
3941
out:
3942
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
3943
 
3944
        return err;
3945
}
3946
 
3947
static int vino_v4l2_s_ctrl(struct vino_channel_settings *vcs,
3948
                            struct v4l2_control *control)
3949
{
3950
        unsigned long flags;
3951
        int i;
3952
        int err = 0;
3953
 
3954
        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
3955
 
3956
        if (!vino_is_input_owner(vcs)) {
3957
                err = -EBUSY;
3958
                goto out;
3959
        }
3960
 
3961
        switch (vcs->input) {
3962
        case VINO_INPUT_D1: {
3963
                struct indycam_control indycam_ctrl;
3964
 
3965
                for (i = 0; i < VINO_INDYCAM_V4L2_CONTROL_COUNT; i++) {
3966
                        if (vino_indycam_v4l2_controls[i].id ==
3967
                            control->id) {
3968
                                if ((control->value >=
3969
                                     vino_indycam_v4l2_controls[i].minimum)
3970
                                    && (control->value <=
3971
                                        vino_indycam_v4l2_controls[i].
3972
                                        maximum)) {
3973
                                        goto found1;
3974
                                } else {
3975
                                        err = -ERANGE;
3976
                                        goto out;
3977
                                }
3978
                        }
3979
                }
3980
 
3981
                err = -EINVAL;
3982
                goto out;
3983
 
3984
found1:
3985
                indycam_ctrl.type = vino_indycam_v4l2_controls[i].reserved[0];
3986
                indycam_ctrl.value = control->value;
3987
 
3988
                err = i2c_camera_command(DECODER_INDYCAM_SET_CONTROL,
3989
                                         &indycam_ctrl);
3990
                if (err)
3991
                        err = -EINVAL;
3992
                break;
3993
        }
3994
        case VINO_INPUT_COMPOSITE:
3995
        case VINO_INPUT_SVIDEO: {
3996
                struct saa7191_control saa7191_ctrl;
3997
 
3998
                for (i = 0; i < VINO_SAA7191_V4L2_CONTROL_COUNT; i++) {
3999
                        if (vino_saa7191_v4l2_controls[i].id ==
4000
                            control->id) {
4001
                                if ((control->value >=
4002
                                     vino_saa7191_v4l2_controls[i].minimum)
4003
                                    && (control->value <=
4004
                                        vino_saa7191_v4l2_controls[i].
4005
                                        maximum)) {
4006
                                        goto found2;
4007
                                } else {
4008
                                        err = -ERANGE;
4009
                                        goto out;
4010
                                }
4011
                        }
4012
                }
4013
                err = -EINVAL;
4014
                goto out;
4015
 
4016
found2:
4017
                saa7191_ctrl.type = vino_saa7191_v4l2_controls[i].reserved[0];
4018
                saa7191_ctrl.value = control->value;
4019
 
4020
                err = i2c_decoder_command(DECODER_SAA7191_SET_CONTROL,
4021
                                          &saa7191_ctrl);
4022
                if (err)
4023
                        err = -EINVAL;
4024
                break;
4025
        }
4026
        default:
4027
                err =  -EINVAL;
4028
        }
4029
 
4030
out:
4031
        spin_unlock_irqrestore(&vino_drvdata->input_lock, flags);
4032
 
4033
        return err;
4034
}
4035
 
4036
/* File operations */
4037
 
4038
static int vino_open(struct inode *inode, struct file *file)
4039
{
4040
        struct video_device *dev = video_devdata(file);
4041
        struct vino_channel_settings *vcs = video_get_drvdata(dev);
4042
        int ret = 0;
4043
        dprintk("open(): channel = %c\n",
4044
               (vcs->channel == VINO_CHANNEL_A) ? 'A' : 'B');
4045
 
4046
        mutex_lock(&vcs->mutex);
4047
 
4048
        if (vcs->users) {
4049
                dprintk("open(): driver busy\n");
4050
                ret = -EBUSY;
4051
                goto out;
4052
        }
4053
 
4054
        ret = vino_acquire_input(vcs);
4055
        if (ret) {
4056
                dprintk("open(): vino_acquire_input() failed\n");
4057
                goto out;
4058
        }
4059
 
4060
        vcs->users++;
4061
 
4062
 out:
4063
        mutex_unlock(&vcs->mutex);
4064
 
4065
        dprintk("open(): %s!\n", ret ? "failed" : "complete");
4066
 
4067
        return ret;
4068
}
4069
 
4070
static int vino_close(struct inode *inode, struct file *file)
4071
{
4072
        struct video_device *dev = video_devdata(file);
4073
        struct vino_channel_settings *vcs = video_get_drvdata(dev);
4074
        dprintk("close():\n");
4075
 
4076
        mutex_lock(&vcs->mutex);
4077
 
4078
        vcs->users--;
4079
 
4080
        if (!vcs->users) {
4081
                vino_release_input(vcs);
4082
 
4083
                /* stop DMA and free buffers */
4084
                vino_capture_stop(vcs);
4085
                vino_queue_free(&vcs->fb_queue);
4086
        }
4087
 
4088
        mutex_unlock(&vcs->mutex);
4089
 
4090
        return 0;
4091
}
4092
 
4093
static void vino_vm_open(struct vm_area_struct *vma)
4094
{
4095
        struct vino_framebuffer *fb = vma->vm_private_data;
4096
 
4097
        fb->map_count++;
4098
        dprintk("vino_vm_open(): count = %d\n", fb->map_count);
4099
}
4100
 
4101
static void vino_vm_close(struct vm_area_struct *vma)
4102
{
4103
        struct vino_framebuffer *fb = vma->vm_private_data;
4104
 
4105
        fb->map_count--;
4106
        dprintk("vino_vm_close(): count = %d\n", fb->map_count);
4107
}
4108
 
4109
static struct vm_operations_struct vino_vm_ops = {
4110
        .open   = vino_vm_open,
4111
        .close  = vino_vm_close,
4112
};
4113
 
4114
static int vino_mmap(struct file *file, struct vm_area_struct *vma)
4115
{
4116
        struct video_device *dev = video_devdata(file);
4117
        struct vino_channel_settings *vcs = video_get_drvdata(dev);
4118
 
4119
        unsigned long start = vma->vm_start;
4120
        unsigned long size = vma->vm_end - vma->vm_start;
4121
        unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
4122
 
4123
        struct vino_framebuffer *fb = NULL;
4124
        unsigned int i, length;
4125
        int ret = 0;
4126
 
4127
        dprintk("mmap():\n");
4128
 
4129
        // TODO: reject mmap if already mapped
4130
 
4131
        if (mutex_lock_interruptible(&vcs->mutex))
4132
                return -EINTR;
4133
 
4134
        if (vcs->reading) {
4135
                ret = -EBUSY;
4136
                goto out;
4137
        }
4138
 
4139
        // TODO: check queue type
4140
 
4141
        if (!(vma->vm_flags & VM_WRITE)) {
4142
                dprintk("mmap(): app bug: PROT_WRITE please\n");
4143
                ret = -EINVAL;
4144
                goto out;
4145
        }
4146
        if (!(vma->vm_flags & VM_SHARED)) {
4147
                dprintk("mmap(): app bug: MAP_SHARED please\n");
4148
                ret = -EINVAL;
4149
                goto out;
4150
        }
4151
 
4152
        /* find the correct buffer using offset */
4153
        length = vino_queue_get_length(&vcs->fb_queue);
4154
        if (length == 0) {
4155
                dprintk("mmap(): queue not initialized\n");
4156
                ret = -EINVAL;
4157
                goto out;
4158
        }
4159
 
4160
        for (i = 0; i < length; i++) {
4161
                fb = vino_queue_get_buffer(&vcs->fb_queue, i);
4162
                if (fb == NULL) {
4163
                        dprintk("mmap(): vino_queue_get_buffer() failed\n");
4164
                        ret = -EINVAL;
4165
                        goto out;
4166
                }
4167
 
4168
                if (fb->offset == offset)
4169
                        goto found;
4170
        }
4171
 
4172
        dprintk("mmap(): invalid offset = %lu\n", offset);
4173
        ret = -EINVAL;
4174
        goto out;
4175
 
4176
found:
4177
        dprintk("mmap(): buffer = %d\n", i);
4178
 
4179
        if (size > (fb->desc_table.page_count * PAGE_SIZE)) {
4180
                dprintk("mmap(): failed: size = %lu > %lu\n",
4181
                        size, fb->desc_table.page_count * PAGE_SIZE);
4182
                ret = -EINVAL;
4183
                goto out;
4184
        }
4185
 
4186
        for (i = 0; i < fb->desc_table.page_count; i++) {
4187
                unsigned long pfn =
4188
                        virt_to_phys((void *)fb->desc_table.virtual[i]) >>
4189
                        PAGE_SHIFT;
4190
 
4191
                if (size < PAGE_SIZE)
4192
                        break;
4193
 
4194
                // protection was: PAGE_READONLY
4195
                if (remap_pfn_range(vma, start, pfn, PAGE_SIZE,
4196
                                    vma->vm_page_prot)) {
4197
                        dprintk("mmap(): remap_pfn_range() failed\n");
4198
                        ret = -EAGAIN;
4199
                        goto out;
4200
                }
4201
 
4202
                start += PAGE_SIZE;
4203
                size -= PAGE_SIZE;
4204
        }
4205
 
4206
        fb->map_count = 1;
4207
 
4208
        vma->vm_flags |= VM_DONTEXPAND | VM_RESERVED;
4209
        vma->vm_flags &= ~VM_IO;
4210
        vma->vm_private_data = fb;
4211
        vma->vm_file = file;
4212
        vma->vm_ops = &vino_vm_ops;
4213
 
4214
out:
4215
        mutex_unlock(&vcs->mutex);
4216
 
4217
        return ret;
4218
}
4219
 
4220
static unsigned int vino_poll(struct file *file, poll_table *pt)
4221
{
4222
        struct video_device *dev = video_devdata(file);
4223
        struct vino_channel_settings *vcs = video_get_drvdata(dev);
4224
        unsigned int outgoing;
4225
        unsigned int ret = 0;
4226
 
4227
        // lock mutex (?)
4228
        // TODO: this has to be corrected for different read modes
4229
 
4230
        dprintk("poll():\n");
4231
 
4232
        if (vino_queue_get_outgoing(&vcs->fb_queue, &outgoing)) {
4233
                dprintk("poll(): vino_queue_get_outgoing() failed\n");
4234
                ret = POLLERR;
4235
                goto error;
4236
        }
4237
        if (outgoing > 0)
4238
                goto over;
4239
 
4240
        poll_wait(file, &vcs->fb_queue.frame_wait_queue, pt);
4241
 
4242
        if (vino_queue_get_outgoing(&vcs->fb_queue, &outgoing)) {
4243
                dprintk("poll(): vino_queue_get_outgoing() failed\n");
4244
                ret = POLLERR;
4245
                goto error;
4246
        }
4247
 
4248
over:
4249
        dprintk("poll(): data %savailable\n",
4250
                (outgoing > 0) ? "" : "not ");
4251
 
4252
        if (outgoing > 0)
4253
                ret = POLLIN | POLLRDNORM;
4254
 
4255
error:
4256
 
4257
        return ret;
4258
}
4259
 
4260
static int vino_do_ioctl(struct inode *inode, struct file *file,
4261
                      unsigned int cmd, void *arg)
4262
{
4263
        struct video_device *dev = video_devdata(file);
4264
        struct vino_channel_settings *vcs = video_get_drvdata(dev);
4265
 
4266
#ifdef VINO_DEBUG
4267
        switch (_IOC_TYPE(cmd)) {
4268
        case 'v':
4269
                dprintk("ioctl(): V4L1 unsupported (0x%08x)\n", cmd);
4270
                break;
4271
        case 'V':
4272
                dprintk("ioctl(): V4L2 %s (0x%08x)\n",
4273
                        v4l2_ioctl_names[_IOC_NR(cmd)], cmd);
4274
                break;
4275
        default:
4276
                dprintk("ioctl(): unsupported command 0x%08x\n", cmd);
4277
        }
4278
#endif
4279
 
4280
        switch (cmd) {
4281
        /* V4L2 interface */
4282
        case VIDIOC_QUERYCAP: {
4283
                vino_v4l2_querycap(arg);
4284
                break;
4285
        }
4286
        case VIDIOC_ENUMINPUT: {
4287
                return vino_v4l2_enuminput(vcs, arg);
4288
        }
4289
        case VIDIOC_G_INPUT: {
4290
                return vino_v4l2_g_input(vcs, arg);
4291
        }
4292
        case VIDIOC_S_INPUT: {
4293
                return vino_v4l2_s_input(vcs, arg);
4294
        }
4295
        case VIDIOC_ENUMSTD: {
4296
                return vino_v4l2_enumstd(vcs, arg);
4297
        }
4298
        case VIDIOC_QUERYSTD: {
4299
                return vino_v4l2_querystd(vcs, arg);
4300
        }
4301
        case VIDIOC_G_STD: {
4302
                return vino_v4l2_g_std(vcs, arg);
4303
        }
4304
        case VIDIOC_S_STD: {
4305
                return vino_v4l2_s_std(vcs, arg);
4306
        }
4307
        case VIDIOC_ENUM_FMT: {
4308
                return vino_v4l2_enum_fmt(vcs, arg);
4309
        }
4310
        case VIDIOC_TRY_FMT: {
4311
                return vino_v4l2_try_fmt(vcs, arg);
4312
        }
4313
        case VIDIOC_G_FMT: {
4314
                return vino_v4l2_g_fmt(vcs, arg);
4315
        }
4316
        case VIDIOC_S_FMT: {
4317
                return vino_v4l2_s_fmt(vcs, arg);
4318
        }
4319
        case VIDIOC_CROPCAP: {
4320
                return vino_v4l2_cropcap(vcs, arg);
4321
        }
4322
        case VIDIOC_G_CROP: {
4323
                return vino_v4l2_g_crop(vcs, arg);
4324
        }
4325
        case VIDIOC_S_CROP: {
4326
                return vino_v4l2_s_crop(vcs, arg);
4327
        }
4328
        case VIDIOC_G_PARM: {
4329
                return vino_v4l2_g_parm(vcs, arg);
4330
        }
4331
        case VIDIOC_S_PARM: {
4332
                return vino_v4l2_s_parm(vcs, arg);
4333
        }
4334
        case VIDIOC_REQBUFS: {
4335
                return vino_v4l2_reqbufs(vcs, arg);
4336
        }
4337
        case VIDIOC_QUERYBUF: {
4338
                return vino_v4l2_querybuf(vcs, arg);
4339
        }
4340
        case VIDIOC_QBUF: {
4341
                return vino_v4l2_qbuf(vcs, arg);
4342
        }
4343
        case VIDIOC_DQBUF: {
4344
                return vino_v4l2_dqbuf(vcs, arg, file->f_flags & O_NONBLOCK);
4345
        }
4346
        case VIDIOC_STREAMON: {
4347
                return vino_v4l2_streamon(vcs);
4348
        }
4349
        case VIDIOC_STREAMOFF: {
4350
                return vino_v4l2_streamoff(vcs);
4351
        }
4352
        case VIDIOC_QUERYCTRL: {
4353
                return vino_v4l2_queryctrl(vcs, arg);
4354
        }
4355
        case VIDIOC_G_CTRL: {
4356
                return vino_v4l2_g_ctrl(vcs, arg);
4357
        }
4358
        case VIDIOC_S_CTRL: {
4359
                return vino_v4l2_s_ctrl(vcs, arg);
4360
        }
4361
        default:
4362
                return -ENOIOCTLCMD;
4363
        }
4364
 
4365
        return 0;
4366
}
4367
 
4368
static int vino_ioctl(struct inode *inode, struct file *file,
4369
                      unsigned int cmd, unsigned long arg)
4370
{
4371
        struct video_device *dev = video_devdata(file);
4372
        struct vino_channel_settings *vcs = video_get_drvdata(dev);
4373
        int ret;
4374
 
4375
        if (mutex_lock_interruptible(&vcs->mutex))
4376
                return -EINTR;
4377
 
4378
        ret = video_usercopy(inode, file, cmd, arg, vino_do_ioctl);
4379
 
4380
        mutex_unlock(&vcs->mutex);
4381
 
4382
        return ret;
4383
}
4384
 
4385
/* Initialization and cleanup */
4386
 
4387
// __initdata
4388
static int vino_init_stage = 0;
4389
 
4390
static const struct file_operations vino_fops = {
4391
        .owner          = THIS_MODULE,
4392
        .open           = vino_open,
4393
        .release        = vino_close,
4394
        .ioctl          = vino_ioctl,
4395
        .mmap           = vino_mmap,
4396
        .poll           = vino_poll,
4397
        .llseek         = no_llseek,
4398
};
4399
 
4400
static struct video_device v4l_device_template = {
4401
        .name           = "NOT SET",
4402
        //.type         = VID_TYPE_CAPTURE | VID_TYPE_SUBCAPTURE |
4403
        //      VID_TYPE_CLIPPING | VID_TYPE_SCALES, VID_TYPE_OVERLAY
4404
        .fops           = &vino_fops,
4405
        .minor          = -1,
4406
};
4407
 
4408
static void vino_module_cleanup(int stage)
4409
{
4410
        switch(stage) {
4411
        case 10:
4412
                video_unregister_device(vino_drvdata->b.v4l_device);
4413
                vino_drvdata->b.v4l_device = NULL;
4414
        case 9:
4415
                video_unregister_device(vino_drvdata->a.v4l_device);
4416
                vino_drvdata->a.v4l_device = NULL;
4417
        case 8:
4418
                vino_i2c_del_bus();
4419
        case 7:
4420
                free_irq(SGI_VINO_IRQ, NULL);
4421
        case 6:
4422
                if (vino_drvdata->b.v4l_device) {
4423
                        video_device_release(vino_drvdata->b.v4l_device);
4424
                        vino_drvdata->b.v4l_device = NULL;
4425
                }
4426
        case 5:
4427
                if (vino_drvdata->a.v4l_device) {
4428
                        video_device_release(vino_drvdata->a.v4l_device);
4429
                        vino_drvdata->a.v4l_device = NULL;
4430
                }
4431
        case 4:
4432
                /* all entries in dma_cpu dummy table have the same address */
4433
                dma_unmap_single(NULL,
4434
                                 vino_drvdata->dummy_desc_table.dma_cpu[0],
4435
                                 PAGE_SIZE, DMA_FROM_DEVICE);
4436
                dma_free_coherent(NULL, VINO_DUMMY_DESC_COUNT
4437
                                  * sizeof(dma_addr_t),
4438
                                  (void *)vino_drvdata->
4439
                                  dummy_desc_table.dma_cpu,
4440
                                  vino_drvdata->dummy_desc_table.dma);
4441
        case 3:
4442
                free_page(vino_drvdata->dummy_page);
4443
        case 2:
4444
                kfree(vino_drvdata);
4445
        case 1:
4446
                iounmap(vino);
4447
        case 0:
4448
                break;
4449
        default:
4450
                dprintk("vino_module_cleanup(): invalid cleanup stage = %d\n",
4451
                        stage);
4452
        }
4453
}
4454
 
4455
static int vino_probe(void)
4456
{
4457
        unsigned long rev_id;
4458
 
4459
        if (ip22_is_fullhouse()) {
4460
                printk(KERN_ERR "VINO doesn't exist in IP22 Fullhouse\n");
4461
                return -ENODEV;
4462
        }
4463
 
4464
        if (!(sgimc->systemid & SGIMC_SYSID_EPRESENT)) {
4465
                printk(KERN_ERR "VINO is not found (EISA BUS not present)\n");
4466
                return -ENODEV;
4467
        }
4468
 
4469
        vino = (struct sgi_vino *)ioremap(VINO_BASE, sizeof(struct sgi_vino));
4470
        if (!vino) {
4471
                printk(KERN_ERR "VINO: ioremap() failed\n");
4472
                return -EIO;
4473
        }
4474
        vino_init_stage++;
4475
 
4476
        if (get_dbe(rev_id, &(vino->rev_id))) {
4477
                printk(KERN_ERR "Failed to read VINO revision register\n");
4478
                vino_module_cleanup(vino_init_stage);
4479
                return -ENODEV;
4480
        }
4481
 
4482
        if (VINO_ID_VALUE(rev_id) != VINO_CHIP_ID) {
4483
                printk(KERN_ERR "Unknown VINO chip ID (Rev/ID: 0x%02lx)\n",
4484
                       rev_id);
4485
                vino_module_cleanup(vino_init_stage);
4486
                return -ENODEV;
4487
        }
4488
 
4489
        printk(KERN_INFO "VINO revision %ld found\n", VINO_REV_NUM(rev_id));
4490
 
4491
        return 0;
4492
}
4493
 
4494
static int vino_init(void)
4495
{
4496
        dma_addr_t dma_dummy_address;
4497
        int i;
4498
 
4499
        vino_drvdata = kzalloc(sizeof(struct vino_settings), GFP_KERNEL);
4500
        if (!vino_drvdata) {
4501
                vino_module_cleanup(vino_init_stage);
4502
                return -ENOMEM;
4503
        }
4504
        vino_init_stage++;
4505
 
4506
        /* create a dummy dma descriptor */
4507
        vino_drvdata->dummy_page = get_zeroed_page(GFP_KERNEL | GFP_DMA);
4508
        if (!vino_drvdata->dummy_page) {
4509
                vino_module_cleanup(vino_init_stage);
4510
                return -ENOMEM;
4511
        }
4512
        vino_init_stage++;
4513
 
4514
        // TODO: use page_count in dummy_desc_table
4515
 
4516
        vino_drvdata->dummy_desc_table.dma_cpu =
4517
                dma_alloc_coherent(NULL,
4518
                VINO_DUMMY_DESC_COUNT * sizeof(dma_addr_t),
4519
                &vino_drvdata->dummy_desc_table.dma,
4520
                GFP_KERNEL | GFP_DMA);
4521
        if (!vino_drvdata->dummy_desc_table.dma_cpu) {
4522
                vino_module_cleanup(vino_init_stage);
4523
                return -ENOMEM;
4524
        }
4525
        vino_init_stage++;
4526
 
4527
        dma_dummy_address = dma_map_single(NULL,
4528
                                           (void *)vino_drvdata->dummy_page,
4529
                                        PAGE_SIZE, DMA_FROM_DEVICE);
4530
        for (i = 0; i < VINO_DUMMY_DESC_COUNT; i++) {
4531
                vino_drvdata->dummy_desc_table.dma_cpu[i] = dma_dummy_address;
4532
        }
4533
 
4534
        /* initialize VINO */
4535
 
4536
        vino->control = 0;
4537
        vino->a.next_4_desc = vino_drvdata->dummy_desc_table.dma;
4538
        vino->b.next_4_desc = vino_drvdata->dummy_desc_table.dma;
4539
        udelay(VINO_DESC_FETCH_DELAY);
4540
 
4541
        vino->intr_status = 0;
4542
 
4543
        vino->a.fifo_thres = VINO_FIFO_THRESHOLD_DEFAULT;
4544
        vino->b.fifo_thres = VINO_FIFO_THRESHOLD_DEFAULT;
4545
 
4546
        return 0;
4547
}
4548
 
4549
static int vino_init_channel_settings(struct vino_channel_settings *vcs,
4550
                                 unsigned int channel, const char *name)
4551
{
4552
        vcs->channel = channel;
4553
        vcs->input = VINO_INPUT_NONE;
4554
        vcs->alpha = 0;
4555
        vcs->users = 0;
4556
        vcs->data_format = VINO_DATA_FMT_GREY;
4557
        vcs->data_norm = VINO_DATA_NORM_NTSC;
4558
        vcs->decimation = 1;
4559
        vino_set_default_clipping(vcs);
4560
        vino_set_default_framerate(vcs);
4561
 
4562
        vcs->capturing = 0;
4563
 
4564
        mutex_init(&vcs->mutex);
4565
        spin_lock_init(&vcs->capture_lock);
4566
 
4567
        mutex_init(&vcs->fb_queue.queue_mutex);
4568
        spin_lock_init(&vcs->fb_queue.queue_lock);
4569
        init_waitqueue_head(&vcs->fb_queue.frame_wait_queue);
4570
 
4571
        vcs->v4l_device = video_device_alloc();
4572
        if (!vcs->v4l_device) {
4573
                vino_module_cleanup(vino_init_stage);
4574
                return -ENOMEM;
4575
        }
4576
        vino_init_stage++;
4577
 
4578
        memcpy(vcs->v4l_device, &v4l_device_template,
4579
               sizeof(struct video_device));
4580
        strcpy(vcs->v4l_device->name, name);
4581
        vcs->v4l_device->release = video_device_release;
4582
 
4583
        video_set_drvdata(vcs->v4l_device, vcs);
4584
 
4585
        return 0;
4586
}
4587
 
4588
static int __init vino_module_init(void)
4589
{
4590
        int ret;
4591
 
4592
        printk(KERN_INFO "SGI VINO driver version %s\n",
4593
               VINO_MODULE_VERSION);
4594
 
4595
        ret = vino_probe();
4596
        if (ret)
4597
                return ret;
4598
 
4599
        ret = vino_init();
4600
        if (ret)
4601
                return ret;
4602
 
4603
        /* initialize data structures */
4604
 
4605
        spin_lock_init(&vino_drvdata->vino_lock);
4606
        spin_lock_init(&vino_drvdata->input_lock);
4607
 
4608
        ret = vino_init_channel_settings(&vino_drvdata->a, VINO_CHANNEL_A,
4609
                                    vino_v4l_device_name_a);
4610
        if (ret)
4611
                return ret;
4612
 
4613
        ret = vino_init_channel_settings(&vino_drvdata->b, VINO_CHANNEL_B,
4614
                                    vino_v4l_device_name_b);
4615
        if (ret)
4616
                return ret;
4617
 
4618
        /* initialize hardware and register V4L devices */
4619
 
4620
        ret = request_irq(SGI_VINO_IRQ, vino_interrupt, 0,
4621
                vino_driver_description, NULL);
4622
        if (ret) {
4623
                printk(KERN_ERR "VINO: requesting IRQ %02d failed\n",
4624
                       SGI_VINO_IRQ);
4625
                vino_module_cleanup(vino_init_stage);
4626
                return -EAGAIN;
4627
        }
4628
        vino_init_stage++;
4629
 
4630
        ret = vino_i2c_add_bus();
4631
        if (ret) {
4632
                printk(KERN_ERR "VINO I2C bus registration failed\n");
4633
                vino_module_cleanup(vino_init_stage);
4634
                return ret;
4635
        }
4636
        vino_init_stage++;
4637
 
4638
        ret = video_register_device(vino_drvdata->a.v4l_device,
4639
                                    VFL_TYPE_GRABBER, -1);
4640
        if (ret < 0) {
4641
                printk(KERN_ERR "VINO channel A Video4Linux-device "
4642
                       "registration failed\n");
4643
                vino_module_cleanup(vino_init_stage);
4644
                return -EINVAL;
4645
        }
4646
        vino_init_stage++;
4647
 
4648
        ret = video_register_device(vino_drvdata->b.v4l_device,
4649
                                    VFL_TYPE_GRABBER, -1);
4650
        if (ret < 0) {
4651
                printk(KERN_ERR "VINO channel B Video4Linux-device "
4652
                       "registration failed\n");
4653
                vino_module_cleanup(vino_init_stage);
4654
                return -EINVAL;
4655
        }
4656
        vino_init_stage++;
4657
 
4658
#if defined(CONFIG_KMOD) && defined(MODULE)
4659
        request_module("saa7191");
4660
        request_module("indycam");
4661
#endif
4662
 
4663
        dprintk("init complete!\n");
4664
 
4665
        return 0;
4666
}
4667
 
4668
static void __exit vino_module_exit(void)
4669
{
4670
        dprintk("exiting, stage = %d ...\n", vino_init_stage);
4671
        vino_module_cleanup(vino_init_stage);
4672
        dprintk("cleanup complete, exit!\n");
4673
}
4674
 
4675
module_init(vino_module_init);
4676
module_exit(vino_module_exit);

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.