1702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*****************************************************************************
2702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas*                                                                            *
3702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas*  easycap.h                                                                 *
4702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas*                                                                            *
5702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas*****************************************************************************/
6702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
7702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *
8702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  Copyright (C) 2010 R.M. Thomas  <rmthomas@sciolus.org>
9702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *
10702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *
11702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  This is free software; you can redistribute it and/or modify
12702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  it under the terms of the GNU General Public License as published by
13702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  the Free Software Foundation; either version 2 of the License, or
14702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  (at your option) any later version.
15702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *
16702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  The software is distributed in the hope that it will be useful,
17702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  GNU General Public License for more details.
20702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *
21702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  You should have received a copy of the GNU General Public License
22702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  along with this software; if not, write to the Free Software
23702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *
25702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas*/
26702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*****************************************************************************/
27702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
28702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
29702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  THE FOLLOWING PARAMETERS ARE UNDEFINED:
30702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *
31702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *                EASYCAP_DEBUG
32702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *
33702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  IF REQUIRED THEY MUST BE EXTERNALLY DEFINED, FOR EXAMPLE AS COMPILER
34702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  OPTIONS.
35702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
36702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
37702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
383dbab7331209d5d85c448675053d3e9e7a4bcd41Tomas Winkler#ifndef __EASYCAP_H__
393dbab7331209d5d85c448675053d3e9e7a4bcd41Tomas Winkler#define __EASYCAP_H__
40702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
41702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
42702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
43f36bc37a48148f31f936557b811431b98dbfe347Mike Thomas *  THESE ARE NORMALLY DEFINED
44f36bc37a48148f31f936557b811431b98dbfe347Mike Thomas */
45f36bc37a48148f31f936557b811431b98dbfe347Mike Thomas/*---------------------------------------------------------------------------*/
46f36bc37a48148f31f936557b811431b98dbfe347Mike Thomas#define  PATIENCE  500
47f36bc37a48148f31f936557b811431b98dbfe347Mike Thomas#define  PERSEVERE
48f36bc37a48148f31f936557b811431b98dbfe347Mike Thomas/*---------------------------------------------------------------------------*/
49f36bc37a48148f31f936557b811431b98dbfe347Mike Thomas/*
50702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  THESE ARE FOR MAINTENANCE ONLY - NORMALLY UNDEFINED:
51702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
52702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
53702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#undef  EASYCAP_TESTCARD
54702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
55702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/kernel.h>
56702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/errno.h>
57702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/init.h>
58702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/slab.h>
59702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/module.h>
60702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/kref.h>
61702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/usb.h>
62702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/uaccess.h>
63702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
64702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/i2c.h>
65702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/workqueue.h>
66702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/poll.h>
67702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/mm.h>
68702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/fs.h>
69702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/delay.h>
70702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/types.h>
71702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
72a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#include <linux/vmalloc.h>
73a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#include <linux/sound.h>
74a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#include <sound/core.h>
75a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#include <sound/pcm.h>
76a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#include <sound/pcm_params.h>
77a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#include <sound/info.h>
78a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#include <sound/initval.h>
79a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#include <sound/control.h>
80702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <media/v4l2-dev.h>
81702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <media/v4l2-device.h>
82702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/videodev2.h>
83702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#include <linux/soundcard.h>
84702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
85702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
86702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*  VENDOR, PRODUCT:  Syntek Semiconductor Co., Ltd
87702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *
88702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *      EITHER        EasyCAP USB 2.0 Video Adapter with Audio, Model No. DC60
89702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *               with input cabling:  AUDIO(L), AUDIO(R), CVBS, S-VIDEO.
90702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *
91702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *          OR        EasyCAP 4CHANNEL USB 2.0 DVR, Model No. EasyCAP002
92702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *               with input cabling:  MICROPHONE, CVBS1, CVBS2, CVBS3, CVBS4.
93702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
94702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
95702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define USB_EASYCAP_VENDOR_ID	0x05e1
96702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define USB_EASYCAP_PRODUCT_ID	0x0408
97702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
98a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#define EASYCAP_DRIVER_VERSION "0.9.01"
99702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define EASYCAP_DRIVER_DESCRIPTION "easycapdc60"
100702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
101e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas#define DONGLE_MANY 8
102f36bc37a48148f31f936557b811431b98dbfe347Mike Thomas#define INPUT_MANY 6
103702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
104702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
105702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  DEFAULT LUMINANCE, CONTRAST, SATURATION AND HUE
106702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
107702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
108702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define SAA_0A_DEFAULT 0x7F
109702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define SAA_0B_DEFAULT 0x3F
110702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define SAA_0C_DEFAULT 0x2F
111702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define SAA_0D_DEFAULT 0x00
112702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
113702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
114702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  VIDEO STREAMING PARAMETERS:
115702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  USB 2.0 PROVIDES FOR HIGH-BANDWIDTH ENDPOINTS WITH AN UPPER LIMIT
116702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  OF 3072 BYTES PER MICROFRAME for wMaxPacketSize.
117702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
118702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
119702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define VIDEO_ISOC_BUFFER_MANY 16
120702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define VIDEO_ISOC_ORDER 3
121702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define VIDEO_ISOC_FRAMESPERDESC ((unsigned int) 1 << VIDEO_ISOC_ORDER)
122702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define USB_2_0_MAXPACKETSIZE 3072
123702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#if (USB_2_0_MAXPACKETSIZE > PAGE_SIZE)
124702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#error video_isoc_buffer[.] will not be big enough
125702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#endif
126f36bc37a48148f31f936557b811431b98dbfe347Mike Thomas#define VIDEO_JUNK_TOLERATE VIDEO_ISOC_BUFFER_MANY
127849322a0f114e52d05e16fe8349843c980cff2c6Mike Thomas#define VIDEO_LOST_TOLERATE 50
128702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
129702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
130702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  VIDEO BUFFERS
131702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
132702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
133702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define FIELD_BUFFER_SIZE (203 * PAGE_SIZE)
134702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define FRAME_BUFFER_SIZE (405 * PAGE_SIZE)
135702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define FIELD_BUFFER_MANY 4
136702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define FRAME_BUFFER_MANY 6
137702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
138702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
139702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  AUDIO STREAMING PARAMETERS
140702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
141702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
142702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define AUDIO_ISOC_BUFFER_MANY 16
143a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#define AUDIO_ISOC_ORDER 1
144a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#define AUDIO_ISOC_FRAMESPERDESC 32
145702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define AUDIO_ISOC_BUFFER_SIZE (PAGE_SIZE << AUDIO_ISOC_ORDER)
146702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
147702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
148702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  AUDIO BUFFERS
149702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
150702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
151702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define AUDIO_FRAGMENT_MANY 32
152a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas#define PAGES_PER_AUDIO_FRAGMENT 4
153702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
154702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
1553d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas *  IT IS ESSENTIAL THAT EVEN-NUMBERED STANDARDS ARE 25 FRAMES PER SECOND,
1563d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas *                        ODD-NUMBERED STANDARDS ARE 30 FRAMES PER SECOND.
1573d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas *  THE NUMBERING OF STANDARDS MUST NOT BE CHANGED WITHOUT DUE CARE.  NOT
1583d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas *  ONLY MUST THE PARAMETER
1593d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas *                             STANDARD_MANY
1603d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas *  BE CHANGED TO CORRESPOND TO THE NEW NUMBER OF STANDARDS, BUT ALSO THE
1613d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas *  NUMBERING MUST REMAIN AN UNBROKEN ASCENDING SEQUENCE:  DUMMY STANDARDS
1623d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas *  MAY NEED TO BE ADDED.   APPROPRIATE CHANGES WILL ALWAYS BE REQUIRED IN
1633d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas *  ROUTINE fillin_formats() AND POSSIBLY ELSEWHERE.  BEWARE.
1643d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas */
1653d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas/*---------------------------------------------------------------------------*/
1663d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define  PAL_BGHIN      0
1673d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define  PAL_Nc         2
1683d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define  SECAM          4
1693d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define  NTSC_N         6
1703d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define  NTSC_N_443     8
1713d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define  NTSC_M         1
1723d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define  NTSC_443       3
1733d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define  NTSC_M_JP      5
1743d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define  PAL_60         7
1753d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define  PAL_M          9
17640b8d50ac98f8c8779aea7459f805e5a69fdb726Mike Thomas#define  PAL_BGHIN_SLOW    10
17740b8d50ac98f8c8779aea7459f805e5a69fdb726Mike Thomas#define  PAL_Nc_SLOW       12
17840b8d50ac98f8c8779aea7459f805e5a69fdb726Mike Thomas#define  SECAM_SLOW        14
17940b8d50ac98f8c8779aea7459f805e5a69fdb726Mike Thomas#define  NTSC_N_SLOW       16
18040b8d50ac98f8c8779aea7459f805e5a69fdb726Mike Thomas#define  NTSC_N_443_SLOW   18
18140b8d50ac98f8c8779aea7459f805e5a69fdb726Mike Thomas#define  NTSC_M_SLOW       11
18240b8d50ac98f8c8779aea7459f805e5a69fdb726Mike Thomas#define  NTSC_443_SLOW     13
18340b8d50ac98f8c8779aea7459f805e5a69fdb726Mike Thomas#define  NTSC_M_JP_SLOW    15
18440b8d50ac98f8c8779aea7459f805e5a69fdb726Mike Thomas#define  PAL_60_SLOW       17
18540b8d50ac98f8c8779aea7459f805e5a69fdb726Mike Thomas#define  PAL_M_SLOW        19
18640b8d50ac98f8c8779aea7459f805e5a69fdb726Mike Thomas#define  STANDARD_MANY 20
1873d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas/*---------------------------------------------------------------------------*/
1883d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas/*
1893d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas *  ENUMS
1903d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas */
1913d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas/*---------------------------------------------------------------------------*/
1923d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomasenum {
19303389996e086fe61216692f0a2bb445051082902Tomas Winkler	AT_720x576,
19403389996e086fe61216692f0a2bb445051082902Tomas Winkler	AT_704x576,
19503389996e086fe61216692f0a2bb445051082902Tomas Winkler	AT_640x480,
19603389996e086fe61216692f0a2bb445051082902Tomas Winkler	AT_720x480,
19703389996e086fe61216692f0a2bb445051082902Tomas Winkler	AT_360x288,
19803389996e086fe61216692f0a2bb445051082902Tomas Winkler	AT_320x240,
19903389996e086fe61216692f0a2bb445051082902Tomas Winkler	AT_360x240,
20003389996e086fe61216692f0a2bb445051082902Tomas Winkler	RESOLUTION_MANY
2013d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas};
2023d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomasenum {
20303389996e086fe61216692f0a2bb445051082902Tomas Winkler	FMT_UYVY,
20403389996e086fe61216692f0a2bb445051082902Tomas Winkler	FMT_YUY2,
20503389996e086fe61216692f0a2bb445051082902Tomas Winkler	FMT_RGB24,
20603389996e086fe61216692f0a2bb445051082902Tomas Winkler	FMT_RGB32,
20703389996e086fe61216692f0a2bb445051082902Tomas Winkler	FMT_BGR24,
20803389996e086fe61216692f0a2bb445051082902Tomas Winkler	FMT_BGR32,
20903389996e086fe61216692f0a2bb445051082902Tomas Winkler	PIXELFORMAT_MANY
2103d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas};
2113d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomasenum {
21203389996e086fe61216692f0a2bb445051082902Tomas Winkler	FIELD_NONE,
21303389996e086fe61216692f0a2bb445051082902Tomas Winkler	FIELD_INTERLACED,
21403389996e086fe61216692f0a2bb445051082902Tomas Winkler	INTERLACE_MANY
2153d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas};
2163d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define SETTINGS_MANY	(STANDARD_MANY * \
2173d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas			RESOLUTION_MANY * \
2183d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas			2 * \
2193d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas			PIXELFORMAT_MANY * \
2203d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas			INTERLACE_MANY)
2213d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas/*---------------------------------------------------------------------------*/
2223d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas/*
223702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  STRUCTURE DEFINITIONS
224702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
225702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
226ae59dad4fef271222d65ac6afe2889eb12ea6ca9Mike Thomasstruct easycap_dongle {
22703389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct easycap *peasycap;
22803389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct mutex mutex_video;
22903389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct mutex mutex_audio;
230ae59dad4fef271222d65ac6afe2889eb12ea6ca9Mike Thomas};
231ae59dad4fef271222d65ac6afe2889eb12ea6ca9Mike Thomas/*---------------------------------------------------------------------------*/
232702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomasstruct data_buffer {
23303389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct list_head list_head;
23403389996e086fe61216692f0a2bb445051082902Tomas Winkler	void *pgo;
23503389996e086fe61216692f0a2bb445051082902Tomas Winkler	void *pto;
236055e3a3a2cdcb7d39d14857e2fb2175c11168ee7Tomas Winkler	u16 kount;
237055e3a3a2cdcb7d39d14857e2fb2175c11168ee7Tomas Winkler	u16 input;
238702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas};
239702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
240702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomasstruct data_urb {
24103389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct list_head list_head;
24203389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct urb *purb;
24303389996e086fe61216692f0a2bb445051082902Tomas Winkler	int isbuf;
24403389996e086fe61216692f0a2bb445051082902Tomas Winkler	int length;
245702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas};
246702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
2473d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomasstruct easycap_standard {
248055e3a3a2cdcb7d39d14857e2fb2175c11168ee7Tomas Winkler	u16 mask;
2493d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomasstruct v4l2_standard v4l2_standard;
2503d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas};
2513d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomasstruct easycap_format {
252055e3a3a2cdcb7d39d14857e2fb2175c11168ee7Tomas Winkler	u16 mask;
25303389996e086fe61216692f0a2bb445051082902Tomas Winkler	char name[128];
2543d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomasstruct v4l2_format v4l2_format;
2553d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas};
256f36bc37a48148f31f936557b811431b98dbfe347Mike Thomasstruct inputset {
25703389996e086fe61216692f0a2bb445051082902Tomas Winkler	int input;
25803389996e086fe61216692f0a2bb445051082902Tomas Winkler	int input_ok;
25903389996e086fe61216692f0a2bb445051082902Tomas Winkler	int standard_offset;
26003389996e086fe61216692f0a2bb445051082902Tomas Winkler	int standard_offset_ok;
26103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int format_offset;
26203389996e086fe61216692f0a2bb445051082902Tomas Winkler	int format_offset_ok;
26303389996e086fe61216692f0a2bb445051082902Tomas Winkler	int brightness;
26403389996e086fe61216692f0a2bb445051082902Tomas Winkler	int brightness_ok;
26503389996e086fe61216692f0a2bb445051082902Tomas Winkler	int contrast;
26603389996e086fe61216692f0a2bb445051082902Tomas Winkler	int contrast_ok;
26703389996e086fe61216692f0a2bb445051082902Tomas Winkler	int saturation;
26803389996e086fe61216692f0a2bb445051082902Tomas Winkler	int saturation_ok;
26903389996e086fe61216692f0a2bb445051082902Tomas Winkler	int hue;
27003389996e086fe61216692f0a2bb445051082902Tomas Winkler	int hue_ok;
271f36bc37a48148f31f936557b811431b98dbfe347Mike Thomas};
2723d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas/*---------------------------------------------------------------------------*/
273702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
274702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *   easycap.ilk == 0   =>  CVBS+S-VIDEO HARDWARE, AUDIO wMaxPacketSize=256
275702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *   easycap.ilk == 2   =>  CVBS+S-VIDEO HARDWARE, AUDIO wMaxPacketSize=9
276702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *   easycap.ilk == 3   =>     FOUR-CVBS HARDWARE, AUDIO wMaxPacketSize=9
277702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
278702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
279702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomasstruct easycap {
28003389996e086fe61216692f0a2bb445051082902Tomas Winkler	int isdongle;
28103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int minor;
282e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas
28303389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct video_device video_device;
28403389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct v4l2_device v4l2_device;
285cb81fa07f8beaead14ce500a0e43171591a03ea7Tomas Winkler
28603389996e086fe61216692f0a2bb445051082902Tomas Winkler	int status;
28703389996e086fe61216692f0a2bb445051082902Tomas Winkler	unsigned int audio_pages_per_fragment;
28803389996e086fe61216692f0a2bb445051082902Tomas Winkler	unsigned int audio_bytes_per_fragment;
28903389996e086fe61216692f0a2bb445051082902Tomas Winkler	unsigned int audio_buffer_page_many;
2903d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas
2913d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#define UPSAMPLE
2923fc0dae888ee216036ae1898fc9186f1dd04f185Tomas Winkler#ifdef UPSAMPLE
293055e3a3a2cdcb7d39d14857e2fb2175c11168ee7Tomas Winkler	s16 oldaudio;
2943d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas#endif /*UPSAMPLE*/
2953d423e91b498b71bfdf4bcfac52c3c27e0f2f39fMike Thomas
29603389996e086fe61216692f0a2bb445051082902Tomas Winkler	int ilk;
29703389996e086fe61216692f0a2bb445051082902Tomas Winkler	bool microphone;
29803389996e086fe61216692f0a2bb445051082902Tomas Winkler
29903389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct usb_device *pusb_device;
30003389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct usb_interface *pusb_interface;
30103389996e086fe61216692f0a2bb445051082902Tomas Winkler
30203389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct kref kref;
30303389996e086fe61216692f0a2bb445051082902Tomas Winkler
30403389996e086fe61216692f0a2bb445051082902Tomas Winkler	int queued[FRAME_BUFFER_MANY];
30503389996e086fe61216692f0a2bb445051082902Tomas Winkler	int done[FRAME_BUFFER_MANY];
30603389996e086fe61216692f0a2bb445051082902Tomas Winkler
30703389996e086fe61216692f0a2bb445051082902Tomas Winkler	wait_queue_head_t wq_video;
30803389996e086fe61216692f0a2bb445051082902Tomas Winkler	wait_queue_head_t wq_audio;
30903389996e086fe61216692f0a2bb445051082902Tomas Winkler	wait_queue_head_t wq_trigger;
31003389996e086fe61216692f0a2bb445051082902Tomas Winkler
31103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int input;
31203389996e086fe61216692f0a2bb445051082902Tomas Winkler	int polled;
31303389996e086fe61216692f0a2bb445051082902Tomas Winkler	int standard_offset;
31403389996e086fe61216692f0a2bb445051082902Tomas Winkler	int format_offset;
31503389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct inputset inputset[INPUT_MANY];
31603389996e086fe61216692f0a2bb445051082902Tomas Winkler
31703389996e086fe61216692f0a2bb445051082902Tomas Winkler	bool ntsc;
31803389996e086fe61216692f0a2bb445051082902Tomas Winkler	int fps;
31903389996e086fe61216692f0a2bb445051082902Tomas Winkler	int usec;
32003389996e086fe61216692f0a2bb445051082902Tomas Winkler	int tolerate;
32103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int skip;
32203389996e086fe61216692f0a2bb445051082902Tomas Winkler	int skipped;
32303389996e086fe61216692f0a2bb445051082902Tomas Winkler	int lost[INPUT_MANY];
32403389996e086fe61216692f0a2bb445051082902Tomas Winkler	int merit[180];
32503389996e086fe61216692f0a2bb445051082902Tomas Winkler
32603389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_interface;
32703389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_altsetting_on;
32803389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_altsetting_off;
32903389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_endpointnumber;
33003389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_isoc_maxframesize;
33103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_isoc_buffer_size;
33203389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_isoc_framesperdesc;
33303389996e086fe61216692f0a2bb445051082902Tomas Winkler
33403389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_isoc_streaming;
33503389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_isoc_sequence;
33603389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_idle;
33703389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_eof;
33803389996e086fe61216692f0a2bb445051082902Tomas Winkler	int    video_junk;
33903389996e086fe61216692f0a2bb445051082902Tomas Winkler
34003389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct data_buffer video_isoc_buffer[VIDEO_ISOC_BUFFER_MANY];
34103389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct data_buffer field_buffer[FIELD_BUFFER_MANY]
34203389996e086fe61216692f0a2bb445051082902Tomas Winkler					[(FIELD_BUFFER_SIZE/PAGE_SIZE)];
34303389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct data_buffer frame_buffer[FRAME_BUFFER_MANY]
34403389996e086fe61216692f0a2bb445051082902Tomas Winkler					[(FRAME_BUFFER_SIZE/PAGE_SIZE)];
34503389996e086fe61216692f0a2bb445051082902Tomas Winkler
34603389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct list_head urb_video_head;
34703389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct list_head *purb_video_head;
34803389996e086fe61216692f0a2bb445051082902Tomas Winkler
349055e3a3a2cdcb7d39d14857e2fb2175c11168ee7Tomas Winkler	u8 cache[8];
350055e3a3a2cdcb7d39d14857e2fb2175c11168ee7Tomas Winkler	u8 *pcache;
35103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int video_mt;
35203389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_mt;
353055e3a3a2cdcb7d39d14857e2fb2175c11168ee7Tomas Winkler	u32 isequence;
35403389996e086fe61216692f0a2bb445051082902Tomas Winkler
35503389996e086fe61216692f0a2bb445051082902Tomas Winkler	int vma_many;
356702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
357702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
358702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  BUFFER INDICATORS
359702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
360702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
36103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int field_fill;	/* Field buffer being filled by easycap_complete().  */
362702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas			/*   Bumped only by easycap_complete().              */
36303389996e086fe61216692f0a2bb445051082902Tomas Winkler	int field_page;	/* Page of field buffer page being filled by         */
364702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas			/*   easycap_complete().                             */
36503389996e086fe61216692f0a2bb445051082902Tomas Winkler	int field_read;	/* Field buffer to be read by field2frame().         */
366702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas			/*   Bumped only by easycap_complete().              */
36703389996e086fe61216692f0a2bb445051082902Tomas Winkler	int frame_fill;	/* Frame buffer being filled by field2frame().       */
368702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas			/*   Bumped only by easycap_dqbuf() when             */
369702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas			/*   field2frame() has created a complete frame.     */
37003389996e086fe61216692f0a2bb445051082902Tomas Winkler	int frame_read;	/* Frame buffer offered to user by DQBUF.            */
371702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas			/*   Set only by easycap_dqbuf() to trail frame_fill.*/
37203389996e086fe61216692f0a2bb445051082902Tomas Winkler	int frame_lock;	/* Flag set to 1 by DQBUF and cleared by QBUF        */
373702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
374702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
375702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  IMAGE PROPERTIES
376702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
377702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
378055e3a3a2cdcb7d39d14857e2fb2175c11168ee7Tomas Winkler	u32                   pixelformat;
37903389996e086fe61216692f0a2bb445051082902Tomas Winkler	int                     width;
38003389996e086fe61216692f0a2bb445051082902Tomas Winkler	int                     height;
38103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int                     bytesperpixel;
38203389996e086fe61216692f0a2bb445051082902Tomas Winkler	bool                    byteswaporder;
38303389996e086fe61216692f0a2bb445051082902Tomas Winkler	bool                    decimatepixel;
38403389996e086fe61216692f0a2bb445051082902Tomas Winkler	bool                    offerfields;
38503389996e086fe61216692f0a2bb445051082902Tomas Winkler	int                     frame_buffer_used;
38603389996e086fe61216692f0a2bb445051082902Tomas Winkler	int                     frame_buffer_many;
38703389996e086fe61216692f0a2bb445051082902Tomas Winkler	int                     videofieldamount;
38803389996e086fe61216692f0a2bb445051082902Tomas Winkler
38903389996e086fe61216692f0a2bb445051082902Tomas Winkler	int                     brightness;
39003389996e086fe61216692f0a2bb445051082902Tomas Winkler	int                     contrast;
39103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int                     saturation;
39203389996e086fe61216692f0a2bb445051082902Tomas Winkler	int                     hue;
39303389996e086fe61216692f0a2bb445051082902Tomas Winkler
39403389996e086fe61216692f0a2bb445051082902Tomas Winkler	int allocation_video_urb;
39503389996e086fe61216692f0a2bb445051082902Tomas Winkler	int allocation_video_page;
39603389996e086fe61216692f0a2bb445051082902Tomas Winkler	int allocation_video_struct;
39703389996e086fe61216692f0a2bb445051082902Tomas Winkler	int registered_video;
398702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
399702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
400a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas *  ALSA
401a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas */
402a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas/*---------------------------------------------------------------------------*/
40303389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct snd_pcm_hardware alsa_hardware;
40403389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct snd_card *psnd_card;
40503389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct snd_pcm *psnd_pcm;
40603389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct snd_pcm_substream *psubstream;
40703389996e086fe61216692f0a2bb445051082902Tomas Winkler	int dma_fill;
40803389996e086fe61216692f0a2bb445051082902Tomas Winkler	int dma_next;
40903389996e086fe61216692f0a2bb445051082902Tomas Winkler	int dma_read;
410a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas/*---------------------------------------------------------------------------*/
411a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas/*
412702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  SOUND PROPERTIES
413702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
414702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
41503389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_interface;
41603389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_altsetting_on;
41703389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_altsetting_off;
41803389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_endpointnumber;
41903389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_isoc_maxframesize;
42003389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_isoc_buffer_size;
42103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_isoc_framesperdesc;
422702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
42303389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_isoc_streaming;
42403389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_idle;
42503389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_eof;
42603389996e086fe61216692f0a2bb445051082902Tomas Winkler	int volume;
42703389996e086fe61216692f0a2bb445051082902Tomas Winkler	int mute;
42803389996e086fe61216692f0a2bb445051082902Tomas Winkler	s8 gain;
429702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
43003389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct data_buffer audio_isoc_buffer[AUDIO_ISOC_BUFFER_MANY];
431702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
43203389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct list_head urb_audio_head;
43303389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct list_head *purb_audio_head;
434702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
435702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
436702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  BUFFER INDICATORS
437702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
438702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
43903389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_fill;	/* Audio buffer being filled by easycap_complete().  */
440a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas			/*   Bumped only by easycap_complete().              */
44103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int audio_read;	/* Audio buffer page being read by easycap_read().   */
442a9855917290fc40dbfd67d3ee06c190667d6c5b5Mike Thomas			/*   Set by easycap_read() to trail audio_fill by    */
443702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas			/*   one fragment.                                   */
444702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
445702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
446702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  SOUND PROPERTIES
447702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
448702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
44903389996e086fe61216692f0a2bb445051082902Tomas Winkler	int allocation_audio_urb;
45003389996e086fe61216692f0a2bb445051082902Tomas Winkler	int allocation_audio_page;
45103389996e086fe61216692f0a2bb445051082902Tomas Winkler	int allocation_audio_struct;
45203389996e086fe61216692f0a2bb445051082902Tomas Winkler	int registered_audio;
453702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
45403389996e086fe61216692f0a2bb445051082902Tomas Winkler	long long int audio_sample;
45503389996e086fe61216692f0a2bb445051082902Tomas Winkler	long long int audio_niveau;
45603389996e086fe61216692f0a2bb445051082902Tomas Winkler	long long int audio_square;
457702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
45803389996e086fe61216692f0a2bb445051082902Tomas Winkler	struct data_buffer audio_buffer[];
459702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas};
460702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
461702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
462702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  VIDEO FUNCTION PROTOTYPES
463702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
464702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
46596bec7dd72511e3c16588d9af52da2cc937f7ea1Tomas Winklerint easycap_newinput(struct easycap *, int);
46696bec7dd72511e3c16588d9af52da2cc937f7ea1Tomas Winklervoid easycap_testcard(struct easycap *, int);
46796bec7dd72511e3c16588d9af52da2cc937f7ea1Tomas Winklerint easycap_isdongle(struct easycap *);
46896bec7dd72511e3c16588d9af52da2cc937f7ea1Tomas Winkler
469f2b3c685b9b1c048cfa8bef98dac037275b9d20dTomas Winklerlong easycap_unlocked_ioctl(struct file *, unsigned int, unsigned long);
47096bec7dd72511e3c16588d9af52da2cc937f7ea1Tomas Winkler
47196bec7dd72511e3c16588d9af52da2cc937f7ea1Tomas Winklerint easycap_video_dqbuf(struct easycap *, int);
47296bec7dd72511e3c16588d9af52da2cc937f7ea1Tomas Winklerint easycap_video_submit_urbs(struct easycap *);
4738b1fad2f046fb825046fee3a41885a70123de988Tomas Winklerint easycap_video_kill_urbs(struct easycap *);
47496bec7dd72511e3c16588d9af52da2cc937f7ea1Tomas Winklerint easycap_video_fillin_formats(void);
47598680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winkler
47698680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint adjust_standard(struct easycap *, v4l2_std_id);
47798680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint adjust_format(struct easycap *, u32, u32, u32, int, bool);
47898680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint adjust_brightness(struct easycap *, int);
47998680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint adjust_contrast(struct easycap *, int);
48098680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint adjust_saturation(struct easycap *, int);
48198680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint adjust_hue(struct easycap *, int);
482702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
483702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
484702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  AUDIO FUNCTION PROTOTYPES
485702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
486702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
48798680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint easycap_alsa_probe(struct easycap *);
4888b1fad2f046fb825046fee3a41885a70123de988Tomas Winklerint easycap_audio_kill_urbs(struct easycap *);
48998680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklervoid easycap_alsa_complete(struct urb *);
490702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
491702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
492702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas *  LOW-LEVEL FUNCTION PROTOTYPES
493702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas */
494702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
49596bec7dd72511e3c16588d9af52da2cc937f7ea1Tomas Winklerint easycap_audio_gainset(struct usb_device *, s8);
49696bec7dd72511e3c16588d9af52da2cc937f7ea1Tomas Winklerint easycap_audio_setup(struct easycap *);
49798680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winkler
49896bec7dd72511e3c16588d9af52da2cc937f7ea1Tomas Winklerint easycap_wakeup_device(struct usb_device *);
49998680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winkler
50098680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint setup_stk(struct usb_device *, bool);
50198680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint setup_saa(struct usb_device *, bool);
50298680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint ready_saa(struct usb_device *);
50398680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint merit_saa(struct usb_device *);
50498680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint check_vt(struct usb_device *);
50598680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint select_input(struct usb_device *, int, int);
50698680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint set_resolution(struct usb_device *, u16, u16, u16, u16);
50798680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winkler
50898680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint read_saa(struct usb_device *, u16);
50998680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint write_saa(struct usb_device *, u16, u16);
51098680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint start_100(struct usb_device *);
51198680557f3ce7eadae0ceda4484fd6c7a13ba3beTomas Winklerint stop_100(struct usb_device *);
512702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
5132a9a05c43294d703e351753da49231c47e0aad0dTomas Winkler
5142a9a05c43294d703e351753da49231c47e0aad0dTomas Winkler
515702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
516702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*
517e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas *  MACROS SAM(...) AND JOM(...) ALLOW DIAGNOSTIC OUTPUT TO BE TAGGED WITH
518e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas *  THE IDENTITY OF THE DONGLE TO WHICH IT APPLIES, BUT IF INVOKED WHEN THE
519e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas *  POINTER peasycap IS INVALID AN Oops IS LIKELY, AND ITS CAUSE MAY NOT BE
520e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas *  IMMEDIATELY OBVIOUS FROM A CASUAL READING OF THE SOURCE CODE.  BEWARE.
521e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas*/
522e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas/*---------------------------------------------------------------------------*/
5235c0c6c395ea8ad2f831c0717f67f957ba84550adTomas Winklerconst char *strerror(int err);
5245c0c6c395ea8ad2f831c0717f67f957ba84550adTomas Winkler
525702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define SAY(format, args...) do { \
526e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas	printk(KERN_DEBUG "easycap:: %s: " \
527e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas			format, __func__, ##args); \
528e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas} while (0)
529e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas#define SAM(format, args...) do { \
530e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas	printk(KERN_DEBUG "easycap::%i%s: " \
531e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas			format, peasycap->isdongle, __func__, ##args);\
532702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas} while (0)
533702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
53402149cf7c7fd1ece5ada28f5a95914f4348df44fTomas Winkler#ifdef CONFIG_EASYCAP_DEBUG
53502149cf7c7fd1ece5ada28f5a95914f4348df44fTomas Winklerextern int easycap_debug;
536702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define JOT(n, format, args...) do { \
53762af33ec6e73d658720ea1190861c8c0609a94b3Randy Dunlap	if (n <= easycap_debug) { \
538e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas		printk(KERN_DEBUG "easycap:: %s: " \
539e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas			format, __func__, ##args);\
540702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas	} \
541702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas} while (0)
542e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas#define JOM(n, format, args...) do { \
54362af33ec6e73d658720ea1190861c8c0609a94b3Randy Dunlap	if (n <= easycap_debug) { \
544e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas		printk(KERN_DEBUG "easycap::%i%s: " \
545e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas			format, peasycap->isdongle, __func__, ##args);\
546e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas	} \
547e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas} while (0)
548e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas
549702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#else
550702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas#define JOT(n, format, args...) do {} while (0)
551e68703cfe8dd2f5605c53b46fae6c9c027e7ef50Mike Thomas#define JOM(n, format, args...) do {} while (0)
55202149cf7c7fd1ece5ada28f5a95914f4348df44fTomas Winkler#endif /* CONFIG_EASYCAP_DEBUG */
553702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
554702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas/*---------------------------------------------------------------------------*/
555702422bd2d3f44e454a97ca7054edde84cc18126R.M. Thomas
556b4f63e9a0f1ca7c6df1f77fdabd4905f4639e8c6Tomas Winkler/*---------------------------------------------------------------------------*/
557b4f63e9a0f1ca7c6df1f77fdabd4905f4639e8c6Tomas Winkler/* globals
558b4f63e9a0f1ca7c6df1f77fdabd4905f4639e8c6Tomas Winkler */
559b4f63e9a0f1ca7c6df1f77fdabd4905f4639e8c6Tomas Winkler/*---------------------------------------------------------------------------*/
560b4f63e9a0f1ca7c6df1f77fdabd4905f4639e8c6Tomas Winkler
5612ef0c05e80cf59315f6f0a4e5a950899f169f2d0Tomas Winklerextern bool easycap_readback;
562b4f63e9a0f1ca7c6df1f77fdabd4905f4639e8c6Tomas Winklerextern const struct easycap_standard easycap_standard[];
563b4f63e9a0f1ca7c6df1f77fdabd4905f4639e8c6Tomas Winklerextern struct easycap_format easycap_format[];
564b4f63e9a0f1ca7c6df1f77fdabd4905f4639e8c6Tomas Winklerextern struct v4l2_queryctrl easycap_control[];
565b4f63e9a0f1ca7c6df1f77fdabd4905f4639e8c6Tomas Winklerextern struct easycap_dongle easycapdc60_dongle[];
566b4f63e9a0f1ca7c6df1f77fdabd4905f4639e8c6Tomas Winkler
5673dbab7331209d5d85c448675053d3e9e7a4bcd41Tomas Winkler#endif /* !__EASYCAP_H__  */
568