em28xx.h revision 16c7bcadff2222b297d13951dc30e133f56d0154
1b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* 2b481de9ca074528fe8c429604e2777db8b89806aZhu Yi em28xx.h - driver for Empia EM2800/EM2820/2840 USB video capture devices 3b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 4b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com> 5b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Ludovico Cavedon <cavedon@sssup.it> 6b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Mauro Carvalho Chehab <mchehab@infradead.org> 7b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 801f8162a854df7f9c259c839ad3c1168ac13b7b8Reinette Chatre Based on the em2800 driver from Sascha Sommer <saschasommer@freenet.de> 9b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 10b481de9ca074528fe8c429604e2777db8b89806aZhu Yi This program is free software; you can redistribute it and/or modify 1101ebd063e11bdcf1ddc605d968ea89aef48e34e0Ian Schram it under the terms of the GNU General Public License as published by 12b481de9ca074528fe8c429604e2777db8b89806aZhu Yi the Free Software Foundation; either version 2 of the License, or 13b481de9ca074528fe8c429604e2777db8b89806aZhu Yi (at your option) any later version. 14b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 15b481de9ca074528fe8c429604e2777db8b89806aZhu Yi This program is distributed in the hope that it will be useful, 16b481de9ca074528fe8c429604e2777db8b89806aZhu Yi but WITHOUT ANY WARRANTY; without even the implied warranty of 17b481de9ca074528fe8c429604e2777db8b89806aZhu Yi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18b481de9ca074528fe8c429604e2777db8b89806aZhu Yi GNU General Public License for more details. 19b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 20b481de9ca074528fe8c429604e2777db8b89806aZhu Yi You should have received a copy of the GNU General Public License 21b481de9ca074528fe8c429604e2777db8b89806aZhu Yi along with this program; if not, write to the Free Software 22b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23b481de9ca074528fe8c429604e2777db8b89806aZhu Yi */ 24b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 25b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#ifndef _EM28XX_H 26b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define _EM28XX_H 27b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 28759ef89fb096c4a6ef078d3cfd5682ac037bd789Winkler, Tomas#include <linux/videodev2.h> 29b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include <media/videobuf-vmalloc.h> 30b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 31b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include <linux/i2c.h> 32b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include <linux/mutex.h> 3301f8162a854df7f9c259c839ad3c1168ac13b7b8Reinette Chatre#include <media/ir-kbd-i2c.h> 34b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE) 35b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include <media/videobuf-dvb.h> 36b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#endif 37b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include "tuner-xc2028.h" 38b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#include "em28xx-reg.h" 39b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 40b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* Boards supported by driver */ 41b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_UNKNOWN 0 42b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_UNKNOWN 1 43b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_TERRATEC_CINERGY_250 2 44b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_PINNACLE_USB_2 3 45b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 4 46b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_MSI_VOX_USB_2 5 47b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_TERRATEC_CINERGY_200 6 48b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_LEADTEK_WINFAST_USBII 7 49b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_KWORLD_USB2800 8 50b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_PINNACLE_DVC_90 9 51b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 10 52b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_TERRATEC_HYBRID_XS 11 53b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_KWORLD_PVRTV2800RF 12 54b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_TERRATEC_PRODIGY_XS 13 55b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_PROLINK_PLAYTV_USB2 14 56b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_VGEAR_POCKETTV 15 57b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 16 58b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_PINNACLE_PCTV_HD_PRO 17 59b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 18 60b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA 19 61b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 20 62b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_BOARD_GRABBEEX_USB2800 21 63fcd427bbba10fc315d1c958b85bba74448db4eb4Ben M Cahill#define EM2750_BOARD_UNKNOWN 22 645a36ba0e412a0e12a8bf2648a075226c1dd7870dTomas Winkler#define EM2750_BOARD_DLCW_130 23 65fcd427bbba10fc315d1c958b85bba74448db4eb4Ben M Cahill#define EM2820_BOARD_DLINK_USB_TV 24 663e0d4cb12f6fd97193a455b49125398b2231c87cTomas Winkler#define EM2820_BOARD_GADMEI_UTV310 25 67fcd427bbba10fc315d1c958b85bba74448db4eb4Ben M Cahill#define EM2820_BOARD_HERCULES_SMART_TV_USB2 26 68b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_PINNACLE_USB_2_FM1216ME 27 696a63578ddf6148927a80c07a73b40ccc8f3ac8e2Emmanuel Grumbach#define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28 706a63578ddf6148927a80c07a73b40ccc8f3ac8e2Emmanuel Grumbach#define EM2820_BOARD_PINNACLE_DVC_100 29 71b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_VIDEOLOGY_20K14XUSB 30 72a3139c5956702c9ff957ac9fe2d902de355b063eSamuel Ortiz#define EM2821_BOARD_USBGEAR_VD204 31 73a3139c5956702c9ff957ac9fe2d902de355b063eSamuel Ortiz#define EM2821_BOARD_SUPERCOMP_USB_2 32 74c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2821_BOARD_PROLINK_PLAYTV_USB2 33 75c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2860_BOARD_TERRATEC_HYBRID_XS 34 76c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2860_BOARD_TYPHOON_DVD_MAKER 35 77c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2860_BOARD_NETGMBH_CAM 36 78c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2860_BOARD_GADMEI_UTV330 37 79c02b3acd29766c6f79c2411cb5b85e1ee72c4c8fChatre, Reinette#define EM2861_BOARD_YAKUMO_MOVIE_MIXER 38 804c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2861_BOARD_KWORLD_PVRTV_300U 39 814c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2861_BOARD_PLEXTOR_PX_TV100U 40 824c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2870_BOARD_KWORLD_350U 41 834c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2870_BOARD_KWORLD_355U 42 844c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2870_BOARD_TERRATEC_XS 43 854c897253cc9ae1c6a2798b27b5fe8e6d94ab6185Tomas Winkler#define EM2870_BOARD_TERRATEC_XS_MT2060 44 86b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2870_BOARD_PINNACLE_PCTV_DVB 45 87b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2870_BOARD_COMPRO_VIDEOMATE 46 88b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_KWORLD_DVB_305U 47 89b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_KWORLD_DVB_310U 48 90b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_MSI_DIGIVOX_AD 49 91b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_MSI_DIGIVOX_AD_II 50 92b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2880_BOARD_TERRATEC_HYBRID_XS_FR 51 93b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2881_BOARD_DNT_DA2_HYBRID 52 94b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2881_BOARD_PINNACLE_HYBRID_PRO 53 95b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2882_BOARD_KWORLD_VS_DVBT 54 96b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2882_BOARD_TERRATEC_HYBRID_XS 55 97b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2882_BOARD_PINNACLE_HYBRID_PRO 56 98b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2883_BOARD_KWORLD_HYBRID_A316 57 99b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU 58 100b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2874_BOARD_PINNACLE_PCTV_80E 59 1010a0bed1d10105a9f58cd14ebe216e8479dd31fdaEmmanuel Grumbach 1020a0bed1d10105a9f58cd14ebe216e8479dd31fdaEmmanuel Grumbach/* Limits minimum and default number of buffers */ 1030a0bed1d10105a9f58cd14ebe216e8479dd31fdaEmmanuel Grumbach#define EM28XX_MIN_BUF 4 104b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_DEF_BUF 8 1052aa6ab86bc475a115f56645591d2413981846509Tomas Winkler 106b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/*Limits the max URB message size */ 107b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define URB_MAX_CTRL_SIZE 80 108b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 109b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* Params for validated field */ 110b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_BOARD_NOT_VALIDATED 1 1119636e583d2c641f8cb32d0681f5052b2885edd79Ron Rindjunsky#define EM28XX_BOARD_VALIDATED 0 112d23000cd8992823e06ca0745564f2c25fe923ce4Wey-Yi Guy 1139636e583d2c641f8cb32d0681f5052b2885edd79Ron Rindjunsky/* maximum number of em28xx boards */ 1149636e583d2c641f8cb32d0681f5052b2885edd79Ron Rindjunsky#define EM28XX_MAXBOARDS 4 /*FIXME: should be bigger */ 1159636e583d2c641f8cb32d0681f5052b2885edd79Ron Rindjunsky 116be5d56ed885a2897ec813eab4a8055d495816e9aTomas Winkler/* maximum number of frames that can be queued */ 1171a5c3d61993f56daf15c35bea8d3943f4e835638Jay Sternberg#define EM28XX_NUM_FRAMES 5 118be5d56ed885a2897ec813eab4a8055d495816e9aTomas Winkler/* number of frames that get used for v4l2_read() */ 119be5d56ed885a2897ec813eab4a8055d495816e9aTomas Winkler#define EM28XX_NUM_READ_FRAMES 2 120be5d56ed885a2897ec813eab4a8055d495816e9aTomas Winkler 121be5d56ed885a2897ec813eab4a8055d495816e9aTomas Winkler/* number of buffers for isoc transfers */ 122b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_NUM_BUFS 5 123b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 124b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* number of packets for each buffer 125b481de9ca074528fe8c429604e2777db8b89806aZhu Yi windows requests only 40 packets .. so we better do the same 126b481de9ca074528fe8c429604e2777db8b89806aZhu Yi this is what I found out for all alternate numbers there! 127b481de9ca074528fe8c429604e2777db8b89806aZhu Yi */ 128b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_NUM_PACKETS 40 129b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 130b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* default alternate; 0 means choose the best */ 131b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_PINOUT 0 132b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 133b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_INTERLACED_DEFAULT 1 134b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 135b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* 136b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define (use usbview if you want to get the other alternate number infos) 137b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define 138b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define alternate number 2 139b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define Endpoint Address: 82 140b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Direction: in 141b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Attribute: 1 142b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Type: Isoc 143b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Max Packet Size: 1448 144b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Interval: 125us 145b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 146b481de9ca074528fe8c429604e2777db8b89806aZhu Yi alternate number 7 147b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 14876a2407a5b043d0950d5657184118e89860d545cJay Sternberg Endpoint Address: 82 149b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Direction: in 150b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Attribute: 1 15176a2407a5b043d0950d5657184118e89860d545cJay Sternberg Type: Isoc 1522f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy Max Packet Size: 3072 153b481de9ca074528fe8c429604e2777db8b89806aZhu Yi Interval: 125us 154b481de9ca074528fe8c429604e2777db8b89806aZhu Yi*/ 155a96a27f97f2bbfc1fca54bc3c0b0d41484152740Tomas Winkler 156b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* time to wait when stopping the isoc transfer */ 157b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM28XX_URB_TIMEOUT msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS) 15880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill 159b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* time in msecs to wait for i2c writes to finish */ 160b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define EM2800_I2C_WRITE_TIMEOUT 20 161b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 162b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum em28xx_mode { 163b481de9ca074528fe8c429604e2777db8b89806aZhu Yi EM28XX_MODE_UNDEFINED, 164b481de9ca074528fe8c429604e2777db8b89806aZhu Yi EM28XX_ANALOG_MODE, 165b481de9ca074528fe8c429604e2777db8b89806aZhu Yi EM28XX_DIGITAL_MODE, 166b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}; 167b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 168b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum em28xx_stream_state { 169b481de9ca074528fe8c429604e2777db8b89806aZhu Yi STREAM_OFF, 170b481de9ca074528fe8c429604e2777db8b89806aZhu Yi STREAM_INTERRUPT, 171b481de9ca074528fe8c429604e2777db8b89806aZhu Yi STREAM_ON, 172b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}; 173b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 174857485c0c46ceee5c658c1761bba4d9a5ddf433fTomas Winklerstruct em28xx; 175b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 176b481de9ca074528fe8c429604e2777db8b89806aZhu Yistruct em28xx_usb_isoc_ctl { 177b481de9ca074528fe8c429604e2777db8b89806aZhu Yi /* max packet size of isoc transaction */ 178b481de9ca074528fe8c429604e2777db8b89806aZhu Yi int max_pkt_size; 179b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 180b481de9ca074528fe8c429604e2777db8b89806aZhu Yi /* number of allocated urbs */ 181abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill int num_bufs; 18280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill 183b481de9ca074528fe8c429604e2777db8b89806aZhu Yi /* urb for isoc transfers */ 184b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct urb **urb; 185b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 186857485c0c46ceee5c658c1761bba4d9a5ddf433fTomas Winkler /* transfer buffers for isoc transfer */ 187b481de9ca074528fe8c429604e2777db8b89806aZhu Yi char **transfer_buffer; 188b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 1899734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler /* Last buffer command and region */ 1909734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler u8 cmd; 1919734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler int pos, size, pktsize; 1929734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler 19351e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison /* Last field: ODD or EVEN? */ 19451e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison int field; 1959734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler 196075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* Stores incomplete commands */ 197857485c0c46ceee5c658c1761bba4d9a5ddf433fTomas Winkler u32 tmp_buf; 198075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int tmp_buf_len; 199075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 200075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* Stores already requested buffers */ 201075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill struct em28xx_buffer *buf; 202857485c0c46ceee5c658c1761bba4d9a5ddf433fTomas Winkler 203075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* Stores the number of received fields */ 2049734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler int nfields; 205075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 206a96a27f97f2bbfc1fca54bc3c0b0d41484152740Tomas Winkler /* isoc urb callback */ 207075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int (*isoc_copy) (struct em28xx *dev, struct urb *urb); 208075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 209075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill}; 210075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 211b481de9ca074528fe8c429604e2777db8b89806aZhu Yistruct em28xx_fmt { 212075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill char *name; 213075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill u32 fourcc; /* v4l2 format id */ 214075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill}; 215075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 216075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill/* buffer for one video frame */ 217b481de9ca074528fe8c429604e2777db8b89806aZhu Yistruct em28xx_buffer { 218075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* common v4l buffer stuff -- must be first */ 219075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill struct videobuf_buffer vb; 2209734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler 2219734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler struct list_head frame; 2229734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler int top_field; 2239734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler int receiving; 2249734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler}; 2259734cb23a02f8de5fa99225ca61c7019ca9f232fTomas Winkler 226b481de9ca074528fe8c429604e2777db8b89806aZhu Yistruct em28xx_dmaqueue { 227b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct list_head active; 228b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct list_head queued; 229075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 230b481de9ca074528fe8c429604e2777db8b89806aZhu Yi wait_queue_head_t wq; 231b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 232b481de9ca074528fe8c429604e2777db8b89806aZhu Yi /* Counters to control buffer fill */ 2333d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler int pos; 2343d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler}; 2353d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler 2363d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler/* io methods */ 2373d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winklerenum em28xx_io_method { 2383d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler IO_NONE, 2393d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler IO_READ, 2403d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler IO_MMAP, 2413d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler}; 2423d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler 2433d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler/* inputs */ 2443d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler 2453d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler#define MAX_EM28XX_INPUT 4 2463d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winklerenum enum28xx_itype { 2473d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_VMUX_COMPOSITE1 = 1, 2483d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_VMUX_COMPOSITE2, 2493d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_VMUX_COMPOSITE3, 2503d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_VMUX_COMPOSITE4, 2513d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_VMUX_SVIDEO, 2523d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_VMUX_TELEVISION, 2533d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_VMUX_CABLE, 2543d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_VMUX_DVB, 2553d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_VMUX_DEBUG, 2563d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_RADIO, 2573d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler}; 2583d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler 2593d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winklerenum em28xx_ac97_mode { 2603d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_NO_AC97 = 0, 2613d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_AC97_EM202, 2623d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler EM28XX_AC97_OTHER, 2633d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler}; 264abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 2655c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel Cstruct em28xx_audio_mode { 266abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill enum em28xx_ac97_mode ac97; 2675c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C 268857485c0c46ceee5c658c1761bba4d9a5ddf433fTomas Winkler u16 ac97_feat; 2695c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C u32 ac97_vendor_id; 270abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 271abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int has_audio:1; 272abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 273abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int i2s_3rates:1; 274abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int i2s_5rates:1; 275abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill}; 276abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 277abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahillenum em28xx_amux { 278abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill EM28XX_AMUX_VIDEO, 279abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill EM28XX_AMUX_LINE_IN, 280abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill}; 281abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 282abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahillstruct em28xx_input { 2835c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C enum enum28xx_itype type; 284abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int vmux; 2855c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C enum em28xx_amux amux; 286abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill}; 2877aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy 288abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill#define INPUT(nr) (&em28xx_boards[dev->model].input[nr]) 289abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 290abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahillenum em28xx_decoder { 291abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill EM28XX_NODECODER, 292abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill EM28XX_TVP5150, 293abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill EM28XX_SAA7113, 294abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill EM28XX_SAA7114 295abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill}; 296abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 297abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahillstruct em28xx_reg_seq { 298abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill int reg; 299abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned char val, mask; 3001061787967db03975dc02030d6815811f4eb9231Daniel Wu int sleep; 301abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill}; 302abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 303abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahillstruct em28xx_board { 304abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill char *name; 305abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill int vchannels; 3065c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C int tuner_type; 3075c5aa3f13a50881b8f6e529e321bbefb5faec37bHalperin, Daniel C int tuner_addr; 308abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 309abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill /* i2c flags */ 310abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int tda9887_conf; 311075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 312abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int is_em2800:1; 313abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int has_msp34xx:1; 314abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int mts_firmware:1; 315abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int has_12mhz_i2s:1; 316075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill unsigned int max_range_640_480:1; 317abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int has_dvb:1; 318abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int has_snapshot_button:1; 319abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill unsigned int valid:1; 320075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 321abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill enum em28xx_decoder decoder; 322abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 323abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill struct em28xx_input input[MAX_EM28XX_INPUT]; 3247aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy struct em28xx_input radio; 3257aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy IR_KEYTAB_TYPE *ir_codes; 3267aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy}; 327abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 3287aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guystruct em28xx_eeprom { 329abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill u32 id; /* 0x9567eb1a */ 330abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill u16 vendor_ID; 331abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill u16 product_ID; 332075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 333abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill u16 chip_conf; 334abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 335abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill u16 board_conf; 336abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill 33776eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler u16 string1, string2, string3; 33876eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler 33976eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler u8 string_idx_table; 34076eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler}; 34176eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler 34276eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler/* device states */ 34376eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winklerenum em28xx_dev_state { 344abceddb40728397fcfd0b295d7530920a606ab88Ben M Cahill DEV_INITIALIZED = 0x01, 345600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler DEV_DISCONNECTED = 0x02, 346600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler DEV_MISCONFIGURED = 0x04, 347600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler}; 348600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler 349600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler#define EM28XX_AUDIO_BUFS 5 350600c0e11ea6161e00e8cb4b4dda39a64ce988c60Tomas Winkler#define EM28XX_NUM_AUDIO_PACKETS 64 35176eff18bdc5feaa53f1be33709b67df02f1d55e9Tomas Winkler#define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */ 35280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill#define EM28XX_CAPTURE_STREAM_EN 1 35380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill 35480cc0c382db318de88577eff027d5c4097abef81Ben M Cahill/* em28xx extensions */ 35580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill#define EM28XX_AUDIO 0x10 35680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill#define EM28XX_DVB 0x20 357e57f14895bf6bc7f16df760963427ac6ee6ff7e1Wey-Yi Guy 358e57f14895bf6bc7f16df760963427ac6ee6ff7e1Wey-Yi Guystruct em28xx_audio { 359e57f14895bf6bc7f16df760963427ac6ee6ff7e1Wey-Yi Guy char name[50]; 36080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill char *transfer_buffer[EM28XX_AUDIO_BUFS]; 36180cc0c382db318de88577eff027d5c4097abef81Ben M Cahill struct urb *urb[EM28XX_AUDIO_BUFS]; 36280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill struct usb_device *udev; 36380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int capture_transfer_done; 36480cc0c382db318de88577eff027d5c4097abef81Ben M Cahill struct snd_pcm_substream *capture_pcm_substream; 36580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill 36680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int hwptr_done_capture; 36780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill struct snd_card *sndcard; 36880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill 36980cc0c382db318de88577eff027d5c4097abef81Ben M Cahill int users, shutdown; 37080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill enum em28xx_stream_state capture_stream; 37180cc0c382db318de88577eff027d5c4097abef81Ben M Cahill spinlock_t slock; 37280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill}; 37380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill 37480cc0c382db318de88577eff027d5c4097abef81Ben M Cahillstruct em28xx; 37580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill 37680cc0c382db318de88577eff027d5c4097abef81Ben M Cahillstruct em28xx_fh { 37780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill struct em28xx *dev; 37880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int stream_on:1; /* Locks streams */ 37980cc0c382db318de88577eff027d5c4097abef81Ben M Cahill int radio; 38080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill 38180cc0c382db318de88577eff027d5c4097abef81Ben M Cahill struct videobuf_queue vb_vidq; 38280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill 38380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill enum v4l2_buf_type type; 38480cc0c382db318de88577eff027d5c4097abef81Ben M Cahill}; 38580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill 38680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill/* main device struct */ 38780cc0c382db318de88577eff027d5c4097abef81Ben M Cahillstruct em28xx { 38880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill /* generic device properties */ 38980cc0c382db318de88577eff027d5c4097abef81Ben M Cahill char name[30]; /* name (including minor) of the device */ 39080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill int model; /* index in the device_data struct */ 39180cc0c382db318de88577eff027d5c4097abef81Ben M Cahill int devno; /* marks the number of this device */ 39280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill enum em28xx_chip_id chip_id; 39380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int is_em2800:1; 39480cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int has_msp34xx:1; 39580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int has_tda9887:1; 39680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int stream_on:1; /* Locks streams */ 39780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int has_audio_class:1; 39880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int has_alsa_audio:1; 39980cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int has_12mhz_i2s:1; 40080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int max_range_640_480:1; 40180cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int has_dvb:1; 40280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int has_snapshot_button:1; 40380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill unsigned int valid:1; /* report for validated boards */ 404630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler 405a96a27f97f2bbfc1fca54bc3c0b0d41484152740Tomas Winkler struct em28xx_IR *ir; 406630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler 407630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler /* Some older em28xx chips needs a waiting time after writing */ 408630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler unsigned int wait_after_write; 409853554accce19d16b03476676bdcb1ccdd44caaeGregory Greenman 410853554accce19d16b03476676bdcb1ccdd44caaeGregory Greenman /* GPIO sequences for analog and digital mode */ 411630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler struct em28xx_reg_seq *analog_gpio, *digital_gpio; 412630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler 413630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler /* GPIO sequences for tuner callbacks */ 414630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler struct em28xx_reg_seq *tun_analog_gpio, *tun_digital_gpio; 415630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler 416630fe9b6f774dd55b71fe94392101eb00df58762Tomas Winkler int video_inputs; /* number of video inputs */ 41780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill struct list_head devlist; 4182f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy 4192f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy u32 i2s_speed; /* I2S speed for audio digital stream */ 4202f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy 4212f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy enum em28xx_decoder decoder; 4222f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy struct em28xx_audio_mode audio_mode; 4232f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy 4242f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy int tuner_type; /* type of the tuner */ 4252f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy int tuner_addr; /* tuner address */ 4262f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy int tda9887_conf; 4272f748deceee10bac563df0e859830cc628d1a841Wey-Yi Guy /* i2c i/o */ 428b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct i2c_adapter i2c_adap; 429b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct i2c_client i2c_client; 430b481de9ca074528fe8c429604e2777db8b89806aZhu Yi /* video for linux */ 431b481de9ca074528fe8c429604e2777db8b89806aZhu Yi int users; /* user count for exclusive use */ 432b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct video_device *vdev; /* video for linux device struct */ 433b481de9ca074528fe8c429604e2777db8b89806aZhu Yi v4l2_std_id norm; /* selected tv norm */ 43451e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison int ctl_freq; /* selected frequency */ 435b481de9ca074528fe8c429604e2777db8b89806aZhu Yi unsigned int ctl_input; /* selected input */ 436b481de9ca074528fe8c429604e2777db8b89806aZhu Yi unsigned int ctl_ainput;/* selected audio input */ 437b481de9ca074528fe8c429604e2777db8b89806aZhu Yi int mute; 438075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int volume; 439075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* frame properties */ 440075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int width; /* current frame width */ 441075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int height; /* current frame height */ 442075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill unsigned hscale; /* horizontal scale factor (see datasheet) */ 443075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill unsigned vscale; /* vertical scale factor (see datasheet) */ 444075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int interlaced; /* 1=interlace fileds, 0=just top fileds */ 445075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill unsigned int video_bytesread; /* Number of bytes read */ 446075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 447075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill unsigned long hash; /* eeprom hash - for boards with generic ID */ 448075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill unsigned long i2c_hash; /* i2c devicelist hash - 449075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill for boards with generic ID */ 450075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 451a96a27f97f2bbfc1fca54bc3c0b0d41484152740Tomas Winkler struct em28xx_audio *adev; 452075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 453075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* states */ 454075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill enum em28xx_dev_state state; 455075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill enum em28xx_io_method io; 456075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 457075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill struct work_struct request_module_wk; 458075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 459075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* locks */ 460b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct mutex lock; 461885ba202cabd90b8ade1fe59185dc96ed4d69e02Tomas Winkler struct mutex ctrl_urb_lock; /* protects urb_buf */ 462b481de9ca074528fe8c429604e2777db8b89806aZhu Yi /* spinlock_t queue_lock; */ 463b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct list_head inqueue, outqueue; 464b481de9ca074528fe8c429604e2777db8b89806aZhu Yi wait_queue_head_t open, wait_frame, wait_stream; 465b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct video_device *vbi_dev; 466b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct video_device *radio_dev; 467075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 468b481de9ca074528fe8c429604e2777db8b89806aZhu Yi unsigned char eedata[256]; 469b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 470b481de9ca074528fe8c429604e2777db8b89806aZhu Yi /* Isoc control struct */ 471b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct em28xx_dmaqueue vidq; 472b481de9ca074528fe8c429604e2777db8b89806aZhu Yi struct em28xx_usb_isoc_ctl isoc_ctl; 473075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill spinlock_t slock; 474075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 475075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* usb transfer */ 4767aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy struct usb_device *udev; /* the usb device */ 477075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int alt; /* alternate */ 478075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int max_pkt_size; /* max packet size of isoc transaction */ 479075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int num_alt; /* Number of alternative settings */ 480075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ 481075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill struct urb *urb[EM28XX_NUM_BUFS]; /* urb for isoc transfers */ 482b481de9ca074528fe8c429604e2777db8b89806aZhu Yi char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc transfer */ 483b481de9ca074528fe8c429604e2777db8b89806aZhu Yi char urb_buf[URB_MAX_CTRL_SIZE]; /* urb control msg buffer */ 484075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 485075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* helper funcs that call usb_control_msg */ 486075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int (*em28xx_write_regs) (struct em28xx *dev, u16 reg, 487075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill char *buf, int len); 488075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int (*em28xx_read_reg) (struct em28xx *dev, u16 reg); 489075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg, 490075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill char *buf, int len); 491075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg, 492075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill char *buf, int len); 493075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg); 494075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 495075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill enum em28xx_mode mode; 496075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 497075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* register numbers for GPO/GPIO registers */ 498075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill u16 reg_gpo_num, reg_gpio_num; 499075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 500075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* Caches GPO and GPIO registers */ 501075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill unsigned char reg_gpo, reg_gpio; 502075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 503075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* Infrared remote control support */ 504075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill IR_KEYTAB_TYPE *ir_codes; 505075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 506075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill /* Snapshot button */ 507075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill char snapshot_button_path[30]; /* path of the input dev */ 508075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill struct input_dev *sbutton_input_dev; 509075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill struct delayed_work sbutton_query_work; 510075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 511075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill struct em28xx_dvb *dvb; 512075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill}; 513075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 514075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillstruct em28xx_ops { 515075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill struct list_head next; 516075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill char *name; 517075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int id; 518075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int (*init)(struct em28xx *); 519075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill int (*fini)(struct em28xx *); 520075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill}; 521075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 522075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill/* Provided by em28xx-i2c.c */ 523075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 524075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillvoid em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg); 525075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillvoid em28xx_do_i2c_scan(struct em28xx *dev); 526075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_i2c_register(struct em28xx *dev); 527075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_i2c_unregister(struct em28xx *dev); 528075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 529075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill/* Provided by em28xx-core.c */ 530075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 531075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillu32 em28xx_request_buffers(struct em28xx *dev, u32 count); 532075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillvoid em28xx_queue_unusedframes(struct em28xx *dev); 533075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillvoid em28xx_release_buffers(struct em28xx *dev); 534075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill 535075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg, 536075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahill char *buf, int len); 537885ba202cabd90b8ade1fe59185dc96ed4d69e02Tomas Winklerint em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg); 538b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_read_reg(struct em28xx *dev, u16 reg); 539b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf, 540b481de9ca074528fe8c429604e2777db8b89806aZhu Yi int len); 541b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len); 542b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_audio_analog_set(struct em28xx *dev); 543075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_audio_setup(struct em28xx *dev); 544b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 545075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_colorlevels_set_default(struct em28xx *dev); 546075416cd18cb4a7ed057d9a96b388bc23b43c4b1Ben M Cahillint em28xx_capture_start(struct em28xx *dev, int start); 547b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_outfmt_set_yuv422(struct em28xx *dev); 548b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_resolution_set(struct em28xx *dev); 549b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_set_alternate(struct em28xx *dev); 550b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_init_isoc(struct em28xx *dev, int max_packets, 551b481de9ca074528fe8c429604e2777db8b89806aZhu Yi int num_bufs, int max_pkt_size, 552b481de9ca074528fe8c429604e2777db8b89806aZhu Yi int (*isoc_copy) (struct em28xx *dev, struct urb *urb)); 553b481de9ca074528fe8c429604e2777db8b89806aZhu Yivoid em28xx_uninit_isoc(struct em28xx *dev); 554885ba202cabd90b8ade1fe59185dc96ed4d69e02Tomas Winklerint em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode); 555b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio); 556b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 557b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* Provided by em28xx-video.c */ 558b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_register_extension(struct em28xx_ops *dev); 559b481de9ca074528fe8c429604e2777db8b89806aZhu Yivoid em28xx_unregister_extension(struct em28xx_ops *dev); 5603195c1f3499912b207ae600968488759b16037fcTomas Winkler 561b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* Provided by em28xx-cards.c */ 562b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern int em2800_variant_detect(struct usb_device *udev, int model); 563b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern void em28xx_pre_card_setup(struct em28xx *dev); 564b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern void em28xx_card_setup(struct em28xx *dev); 565b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern struct em28xx_board em28xx_boards[]; 566b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern struct usb_device_id em28xx_id_table[]; 567b481de9ca074528fe8c429604e2777db8b89806aZhu Yiextern const unsigned int em28xx_bcount; 568b481de9ca074528fe8c429604e2777db8b89806aZhu Yivoid em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir); 569b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_tuner_callback(void *ptr, int component, int command, int arg); 570b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 571b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* Provided by em28xx-input.c */ 572b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); 573b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); 574b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key, 575b481de9ca074528fe8c429604e2777db8b89806aZhu Yi u32 *ir_raw); 576b481de9ca074528fe8c429604e2777db8b89806aZhu Yivoid em28xx_register_snapshot_button(struct em28xx *dev); 577b481de9ca074528fe8c429604e2777db8b89806aZhu Yivoid em28xx_deregister_snapshot_button(struct em28xx *dev); 578b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 579b481de9ca074528fe8c429604e2777db8b89806aZhu Yiint em28xx_ir_init(struct em28xx *dev); 58014519a0b46085db68e610147098d03386c34801fBen M Cahillint em28xx_ir_fini(struct em28xx *dev); 58151e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison 5827b841727d2715d97592f46164804b34d6241644fRick Farrington/* printk macros */ 58351e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison 58414519a0b46085db68e610147098d03386c34801fBen M Cahill#define em28xx_err(fmt, arg...) do {\ 58551e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison printk(KERN_ERR fmt , ##arg); } while (0) 58614519a0b46085db68e610147098d03386c34801fBen M Cahill 58751e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison#define em28xx_errdev(fmt, arg...) do {\ 58814519a0b46085db68e610147098d03386c34801fBen M Cahill printk(KERN_ERR "%s: "fmt,\ 58951e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison dev->name , ##arg); } while (0) 59014519a0b46085db68e610147098d03386c34801fBen M Cahill 59151e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison#define em28xx_info(fmt, arg...) do {\ 59214519a0b46085db68e610147098d03386c34801fBen M Cahill printk(KERN_INFO "%s: "fmt,\ 59351e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison dev->name , ##arg); } while (0) 59414519a0b46085db68e610147098d03386c34801fBen M Cahill#define em28xx_warn(fmt, arg...) do {\ 59514519a0b46085db68e610147098d03386c34801fBen M Cahill printk(KERN_WARNING "%s: "fmt,\ 596b481de9ca074528fe8c429604e2777db8b89806aZhu Yi dev->name , ##arg); } while (0) 597b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 59851e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrisonstatic inline int em28xx_compression_disable(struct em28xx *dev) 59951e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison{ 600b481de9ca074528fe8c429604e2777db8b89806aZhu Yi /* side effect of disabling scaler and mixer */ 60151e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison return em28xx_write_regs(dev, EM28XX_R26_COMPR, "\x00", 1); 602b481de9ca074528fe8c429604e2777db8b89806aZhu Yi} 60351e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison 604b481de9ca074528fe8c429604e2777db8b89806aZhu Yistatic inline int em28xx_contrast_get(struct em28xx *dev) 60551e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison{ 60651e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f; 607b481de9ca074528fe8c429604e2777db8b89806aZhu Yi} 60851e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison 60951e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrisonstatic inline int em28xx_brightness_get(struct em28xx *dev) 61051e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison{ 61151e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison return em28xx_read_reg(dev, EM28XX_R21_YOFFSET); 612b481de9ca074528fe8c429604e2777db8b89806aZhu Yi} 61351e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison 61451e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrisonstatic inline int em28xx_saturation_get(struct em28xx *dev) 615b481de9ca074528fe8c429604e2777db8b89806aZhu Yi{ 616b481de9ca074528fe8c429604e2777db8b89806aZhu Yi return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f; 61751e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison} 618b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 61914519a0b46085db68e610147098d03386c34801fBen M Cahillstatic inline int em28xx_u_balance_get(struct em28xx *dev) 62014519a0b46085db68e610147098d03386c34801fBen M Cahill{ 62114519a0b46085db68e610147098d03386c34801fBen M Cahill return em28xx_read_reg(dev, EM28XX_R23_UOFFSET); 62251e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison} 62314519a0b46085db68e610147098d03386c34801fBen M Cahill 62414519a0b46085db68e610147098d03386c34801fBen M Cahillstatic inline int em28xx_v_balance_get(struct em28xx *dev) 62514519a0b46085db68e610147098d03386c34801fBen M Cahill{ 62651e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison return em28xx_read_reg(dev, EM28XX_R24_VOFFSET); 6277aafef1c6e2e24f9a10dc2972bf0ee70624ccc47Wey-Yi Guy} 62814519a0b46085db68e610147098d03386c34801fBen M Cahill 62914519a0b46085db68e610147098d03386c34801fBen M Cahillstatic inline int em28xx_gamma_get(struct em28xx *dev) 63051e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison{ 631a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f; 632a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy} 633a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy 634a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guystatic inline int em28xx_contrast_set(struct em28xx *dev, s32 val) 635a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy{ 636a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy u8 tmp = (u8) val; 637a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1); 638a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy} 639a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy 640a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guystatic inline int em28xx_brightness_set(struct em28xx *dev, s32 val) 641a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy{ 642a2b0f02e4795bfde5f11720a10af8923cb98b654Wey-Yi Guy u8 tmp = (u8) val; 643a326a5d096f031af46c0073dd78eb80dea1f311aEmmanuel Grumbach return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1); 64451e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison} 64514519a0b46085db68e610147098d03386c34801fBen M Cahill 646b481de9ca074528fe8c429604e2777db8b89806aZhu Yistatic inline int em28xx_saturation_set(struct em28xx *dev, s32 val) 647b481de9ca074528fe8c429604e2777db8b89806aZhu Yi{ 64851e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison u8 tmp = (u8) val; 649b481de9ca074528fe8c429604e2777db8b89806aZhu Yi return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1); 65051e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison} 651b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 65251e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrisonstatic inline int em28xx_u_balance_set(struct em28xx *dev, s32 val) 653b481de9ca074528fe8c429604e2777db8b89806aZhu Yi{ 65451e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison u8 tmp = (u8) val; 655b481de9ca074528fe8c429604e2777db8b89806aZhu Yi return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1); 65651e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison} 657b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 65851e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrisonstatic inline int em28xx_v_balance_set(struct em28xx *dev, s32 val) 659b481de9ca074528fe8c429604e2777db8b89806aZhu Yi{ 66051e9bf5d795b8e01e54391f1790974c7b166d286Harvey Harrison u8 tmp = (u8) val; 661b481de9ca074528fe8c429604e2777db8b89806aZhu Yi return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1); 66280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill} 663b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 66480cc0c382db318de88577eff027d5c4097abef81Ben M Cahillstatic inline int em28xx_gamma_set(struct em28xx *dev, s32 val) 66580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill{ 66680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill u8 tmp = (u8) val; 66780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1); 66880cc0c382db318de88577eff027d5c4097abef81Ben M Cahill} 66980cc0c382db318de88577eff027d5c4097abef81Ben M Cahill 67080cc0c382db318de88577eff027d5c4097abef81Ben M Cahill/*FIXME: maxw should be dependent of alt mode */ 67180cc0c382db318de88577eff027d5c4097abef81Ben M Cahillstatic inline unsigned int norm_maxw(struct em28xx *dev) 67280cc0c382db318de88577eff027d5c4097abef81Ben M Cahill{ 67380cc0c382db318de88577eff027d5c4097abef81Ben M Cahill if (dev->max_range_640_480) 67480cc0c382db318de88577eff027d5c4097abef81Ben M Cahill return 640; 67580cc0c382db318de88577eff027d5c4097abef81Ben M Cahill else 67680cc0c382db318de88577eff027d5c4097abef81Ben M Cahill return 720; 67780cc0c382db318de88577eff027d5c4097abef81Ben M Cahill} 678b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 6793d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winklerstatic inline unsigned int norm_maxh(struct em28xx *dev) 6803d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler{ 6813d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler if (dev->max_range_640_480) 6823d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler return 480; 6833d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler else 6843d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler return (dev->norm & V4L2_STD_625_50) ? 576 : 480; 6853d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler} 6863d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler#endif 6873d24a9f790c0e39cfdef1446c7100e89c542805cTomas Winkler