em28xx.h revision 66d9cbad5330d6df30c82f10ee18b62b096b84ef
1712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* 2712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler em28xx.h - driver for Empia EM2800/EM2820/2840 USB video capture devices 3712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 4712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com> 51f44780827c6bbbcd1f12d5c6b6ce84f49a96bc0Reinette Chatre Ludovico Cavedon <cavedon@sssup.it> 6712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler Mauro Carvalho Chehab <mchehab@infradead.org> 7712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 8712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler Based on the em2800 driver from Sascha Sommer <saschasommer@freenet.de> 9712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 10712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler This program is free software; you can redistribute it and/or modify 11712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler it under the terms of the GNU General Public License as published by 12712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler the Free Software Foundation; either version 2 of the License, or 13712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler (at your option) any later version. 14712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 15712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler This program is distributed in the hope that it will be useful, 16712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler but WITHOUT ANY WARRANTY; without even the implied warranty of 17712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler GNU General Public License for more details. 19712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 20712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler You should have received a copy of the GNU General Public License 21712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler along with this program; if not, write to the Free Software 22712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 24712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 25759ef89fb096c4a6ef078d3cfd5682ac037bd789Winkler, Tomas#ifndef _EM28XX_H 26712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define _EM28XX_H 27712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 28712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/videodev2.h> 295a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <media/videobuf-vmalloc.h> 30712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <media/v4l2-device.h> 31712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 32712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/i2c.h> 33712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <linux/mutex.h> 34712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <media/ir-kbd-i2c.h> 35712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE) 36712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include <media/videobuf-dvb.h> 37712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#endif 383e0d4cb12f6fd97193a455b49125398b2231c87cTomas Winkler#include "tuner-xc2028.h" 39712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#include "em28xx-reg.h" 40fee1247a30e5b3d48fe985b4a935eb6818f3b464Tomas Winkler 413395f6e9cf48469d7ee05703cad1502002741c16Tomas Winkler/* Boards supported by driver */ 425225935b53ce1eafb222c644230d03ad6011d357Wey-Yi Guy#define EM2800_BOARD_UNKNOWN 0 43712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_UNKNOWN 1 44712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_TERRATEC_CINERGY_250 2 454c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_PINNACLE_USB_2 3 464c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 4 474c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_MSI_VOX_USB_2 5 484c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2800_BOARD_TERRATEC_CINERGY_200 6 49712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2800_BOARD_LEADTEK_WINFAST_USBII 7 50712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2800_BOARD_KWORLD_USB2800 8 514c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_PINNACLE_DVC_90 9 524c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 10 534c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_TERRATEC_HYBRID_XS 11 544c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_KWORLD_PVRTV2800RF 12 554c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_TERRATEC_PRODIGY_XS 13 564c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2820_BOARD_PROLINK_PLAYTV_USB2 14 57712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2800_BOARD_VGEAR_POCKETTV 15 58712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 16 594c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_PINNACLE_PCTV_HD_PRO 17 604c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 18 614c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2860_BOARD_SAA711X_REFERENCE_DESIGN 19 624c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 20 634c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2800_BOARD_GRABBEEX_USB2800 21 644c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg#define EM2750_BOARD_UNKNOWN 22 65445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler#define EM2750_BOARD_DLCW_130 23 66445c2dff409ef9de5d2f964d20917ab238fd266fTomas Winkler#define EM2820_BOARD_DLINK_USB_TV 24 67712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_GADMEI_UTV310 25 68712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_HERCULES_SMART_TV_USB2 26 69712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_PINNACLE_USB_2_FM1216ME 27 70712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28 71712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_VIDEOLOGY_20K14XUSB 30 72712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2821_BOARD_USBGEAR_VD204 31 73712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2821_BOARD_SUPERCOMP_USB_2 32 74712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_TERRATEC_HYBRID_XS 34 75712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_TYPHOON_DVD_MAKER 35 76712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_NETGMBH_CAM 36 77712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_GADMEI_UTV330 37 78712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2861_BOARD_YAKUMO_MOVIE_MIXER 38 79712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2861_BOARD_KWORLD_PVRTV_300U 39 80712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2861_BOARD_PLEXTOR_PX_TV100U 40 81712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_KWORLD_350U 41 82712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_KWORLD_355U 42 83712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_TERRATEC_XS 43 84712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_TERRATEC_XS_MT2060 44 85712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_PINNACLE_PCTV_DVB 45 86712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_COMPRO_VIDEOMATE 46 87712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_KWORLD_DVB_305U 47 88712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_KWORLD_DVB_310U 48 89712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_MSI_DIGIVOX_AD 49 90712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_MSI_DIGIVOX_AD_II 50 91712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_TERRATEC_HYBRID_XS_FR 51 92189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2881_BOARD_DNT_DA2_HYBRID 52 93189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2881_BOARD_PINNACLE_HYBRID_PRO 53 94189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2882_BOARD_KWORLD_VS_DVBT 54 95189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2882_BOARD_TERRATEC_HYBRID_XS 55 96189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2882_BOARD_PINNACLE_HYBRID_PRO 56 97189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2883_BOARD_KWORLD_HYBRID_330U 57 98189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU 58 99189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 60 100712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2 61 101712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_GADMEI_TVR200 62 102712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_KAIOMY_TVNPC_U2 63 103712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_EASYCAP 64 104712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_IODATA_GVMVP_SZ 65 105712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2880_BOARD_EMPIRE_DUAL_TV 66 106712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_TERRATEC_GRABBY 67 107712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2860_BOARD_TERRATEC_AV350 68 108712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2882_BOARD_KWORLD_ATSC_315U 69 109712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2882_BOARD_EVGA_INDTUBE 70 110712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2820_BOARD_SILVERCREST_WEBCAM 71 111712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2861_BOARD_GADMEI_UTV330PLUS 72 112712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM2870_BOARD_REDDO_DVB_C_USB_BOX 73 11328f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten#define EM2800_BOARD_VC211A 74 11422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 115712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* Limits minimum and default number of buffers */ 116712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM28XX_MIN_BUF 4 11722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_DEF_BUF 8 11822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 11998a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy/*Limits the max URB message size */ 12098a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy#define URB_MAX_CTRL_SIZE 80 12122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 12222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* Params for validated field */ 12322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_BOARD_NOT_VALIDATED 1 12422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_BOARD_VALIDATED 0 12522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 12622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* Params for em28xx_cmd() audio */ 12798a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy#define EM28XX_START_AUDIO 1 12822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_STOP_AUDIO 0 12922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 13022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* maximum number of em28xx boards */ 13122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_MAXBOARDS 4 /*FIXME: should be bigger */ 13222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 13322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* maximum number of frames that can be queued */ 13498a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy#define EM28XX_NUM_FRAMES 5 13522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* number of frames that get used for v4l2_read() */ 13622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_NUM_READ_FRAMES 2 13722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 13822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* number of buffers for isoc transfers */ 13922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_NUM_BUFS 5 14022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 14122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* number of packets for each buffer 14222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy windows requests only 40 packets .. so we better do the same 14322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy this is what I found out for all alternate numbers there! 14422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy */ 14522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_NUM_PACKETS 40 14622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 14722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM28XX_INTERLACED_DEFAULT 1 1487163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guy 14922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy/* 15022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define (use usbview if you want to get the other alternate number infos) 15122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define 15222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define alternate number 2 15322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define Endpoint Address: 82 15422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy Direction: in 15522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy Attribute: 1 156712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler Type: Isoc 15722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy Max Packet Size: 1448 15822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy Interval: 125us 15922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 16022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy alternate number 7 16122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 16222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy Endpoint Address: 82 1637163b8a4ec995dabda3e92c6fed7b8600060618cWey-Yi Guy Direction: in 16422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy Attribute: 1 16522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy Type: Isoc 166712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler Max Packet Size: 3072 167712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler Interval: 125us 168712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler*/ 169712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 170712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* time to wait when stopping the isoc transfer */ 171712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define EM28XX_URB_TIMEOUT \ 17228f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS) 17322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 174712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* time in msecs to wait for i2c writes to finish */ 17522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy#define EM2800_I2C_WRITE_TIMEOUT 20 17622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 17722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guyenum em28xx_mode { 17898a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy EM28XX_SUSPEND, 17922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy EM28XX_ANALOG_MODE, 18022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy EM28XX_DIGITAL_MODE, 18122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy}; 182712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 18322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guyenum em28xx_stream_state { 18422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy STREAM_OFF, 18522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy STREAM_INTERRUPT, 18698a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy STREAM_ON, 18722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy}; 18822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 18922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guystruct em28xx; 19022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 19122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guystruct em28xx_usb_isoc_ctl { 19222fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy /* max packet size of isoc transaction */ 19398a7b43be19faa7b92576c62614c45e38517331cWey-Yi Guy int max_pkt_size; 19422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 19522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy /* number of allocated urbs */ 19622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy int num_bufs; 19722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 19822fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy /* urb for isoc transfers */ 19922fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy struct urb **urb; 20022fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 20122fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy /* transfer buffers for isoc transfer */ 202712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler char **transfer_buffer; 20322fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 20422fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy /* Last buffer command and region */ 20522fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy u8 cmd; 20622fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy int pos, size, pktsize; 20722fdf3c9e19dce6d66bcfdbed547a5aa52b89933Wey-Yi Guy 208712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler /* Last field: ODD or EVEN? */ 209712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int field; 210712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 211712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler /* Stores incomplete commands */ 212712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler u32 tmp_buf; 213712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int tmp_buf_len; 214712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 215712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler /* Stores already requested buffers */ 2162943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy struct em28xx_buffer *vid_buf; 217712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct em28xx_buffer *vbi_buf; 218712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 219712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler /* Stores the number of received fields */ 22028f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten int nfields; 2212943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy 222712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler /* isoc urb callback */ 2235ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy int (*isoc_copy) (struct em28xx *dev, struct urb *urb); 2244c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg 2254c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg}; 2265ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy 2274c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg/* Struct to enumberate video formats */ 2285ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guystruct em28xx_fmt { 2294c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg char *name; 2305ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy u32 fourcc; /* v4l2 format id */ 2314c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg int depth; 2322943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy int reg; 2332943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy}; 2342943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy 2355ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy/* buffer for one video frame */ 2364c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Bergstruct em28xx_buffer { 2375ade1e4dd1df436c3a441d17321c24aac8497306Wey-Yi Guy /* common v4l buffer stuff -- must be first */ 2384c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg struct videobuf_buffer vb; 2394c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg 2404c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg struct list_head frame; 2414c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg int top_field; 242712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int receiving; 243712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 244712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 245712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstruct em28xx_dmaqueue { 246712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct list_head active; 247712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler struct list_head queued; 248712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 249712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler wait_queue_head_t wq; 250712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 251712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler /* Counters to control buffer fill */ 252712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int pos; 253712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 254712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2552943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy/* io methods */ 2562943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guyenum em28xx_io_method { 257db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar IO_NONE, 258712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler IO_READ, 259db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar IO_MMAP, 260712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 261712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 2622943f136ffe29adb08162197b129bf8106e8191cWey-Yi Guy/* inputs */ 263712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 264712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler#define MAX_EM28XX_INPUT 4 265712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerenum enum28xx_itype { 266712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_VMUX_COMPOSITE1 = 1, 267712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_VMUX_COMPOSITE2, 268712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_VMUX_COMPOSITE3, 269712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_VMUX_COMPOSITE4, 270712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_VMUX_SVIDEO, 271712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_VMUX_TELEVISION, 272712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_VMUX_CABLE, 273712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_VMUX_DVB, 274712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_VMUX_DEBUG, 275712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_RADIO, 276712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 277712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 278712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerenum em28xx_ac97_mode { 279712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_NO_AC97 = 0, 280712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_AC97_EM202, 2814c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg EM28XX_AC97_SIGMATEL, 2824c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg EM28XX_AC97_OTHER, 283712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 2844c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Berg 2854c84a8f1679f754d6080e49892f5cae2c88c91a8Johannes Bergstruct em28xx_audio_mode { 286712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler enum em28xx_ac97_mode ac97; 287712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 288712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler u16 ac97_feat; 289712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler u32 ac97_vendor_id; 290712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 291712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler unsigned int has_audio:1; 292712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 293712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler unsigned int i2s_3rates:1; 29428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten unsigned int i2s_5rates:1; 2956def9761f72501e638e79eebcd70afea12a3a93dTomas Winkler}; 2965425e490471d521bae2fce16d22995803b41d90fTomas Winkler 297712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler/* em28xx has two audio inputs: tuner and line in. 298712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler However, on most devices, an auxiliary AC97 codec device is used. 299712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler The AC97 device may have several different inputs and outputs, 300712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler depending on their model. So, it is possible to use AC97 mixer to 301712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler address more than two different entries. 302712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler */ 303712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerenum em28xx_amux { 3043ac7f14694dd38273d9d96f1c873233d71190c15Tomas Winkler /* This is the only entry for em28xx tuner input */ 305712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_AMUX_VIDEO, /* em28xx tuner, AC97 mixer Video */ 306712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 307db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar EM28XX_AMUX_LINE_IN, /* AC97 mixer Line In */ 308712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 309712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler /* Some less-common mixer setups */ 310712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_AMUX_VIDEO2, /* em28xx Line in, AC97 mixer Video */ 311712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_AMUX_PHONE, 312da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AMUX_MIC, 313da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AMUX_CD, 314da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AMUX_AUX, 315da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AMUX_PCM_OUT, 316da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg}; 317da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg 318da73511d4316c4e3efe903e123286c5b55a1999fJohannes Bergenum em28xx_aout { 319da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg /* AC97 outputs */ 320da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AOUT_MASTER = 1 << 0, 321da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AOUT_LINE = 1 << 1, 322712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler EM28XX_AOUT_MONO = 1 << 2, 323da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AOUT_LFE = 1 << 3, 324da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AOUT_SURR = 1 << 4, 325da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg 326da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg /* PCM IN Mixer - used by AC97_RECORD_SELECT register */ 327da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AOUT_PCM_IN = 1 << 7, 328da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg 329da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg /* Bits 10-8 are used to indicate the PCM IN record select */ 330da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AOUT_PCM_MIC_PCM = 0 << 8, 331da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AOUT_PCM_CD = 1 << 8, 332da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AOUT_PCM_VIDEO = 2 << 8, 333da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AOUT_PCM_AUX = 3 << 8, 334da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AOUT_PCM_LINE = 4 << 8, 335db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar EM28XX_AOUT_PCM_STEREO = 5 << 8, 336da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg EM28XX_AOUT_PCM_MONO = 6 << 8, 337db0589f3b9443f2b57ea6daaec09c1ab0ac99cb0Abhijeet Kolekar EM28XX_AOUT_PCM_PHONE = 7 << 8, 338712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler}; 339da73511d4316c4e3efe903e123286c5b55a1999fJohannes Berg 340da73511d4316c4e3efe903e123286c5b55a1999fJohannes Bergstatic inline int ac97_return_record_select(int a_out) 341712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler{ 342712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler return (a_out & 0x700) >> 8; 343712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler} 344712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler 345712b6cf57a53da608a682b5f782c5785bda76001Tomas Winklerstruct em28xx_reg_seq { 346712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler int reg; 347712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler unsigned char val, mask; 3480848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy int sleep; 3498dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler}; 3508dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 3518dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winklerstruct em28xx_input { 3528dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler enum enum28xx_itype type; 3538dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler unsigned int vmux; 35428f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten enum em28xx_amux amux; 3558dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler enum em28xx_aout aout; 3568dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler struct em28xx_reg_seq *gpio; 3578dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler}; 358e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy 3598dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler#define INPUT(nr) (&em28xx_boards[dev->model].input[nr]) 3608dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 3618dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winklerenum em28xx_decoder { 3628dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler EM28XX_NODECODER = 0, 3630848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy EM28XX_TVP5150, 3648dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler EM28XX_SAA711X, 3658dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler}; 3668dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 367c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawallenum em28xx_sensor { 368c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall EM28XX_NOSENSOR = 0, 369c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall EM28XX_MT9V011, 370c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall EM28XX_MT9M001, 371c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall EM28XX_MT9M111, 372c37457e69ffd7d3c94cbfcc1c39be9a45dd7ad21Julia Lawall}; 3738dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 3748dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winklerenum em28xx_adecoder { 3758dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler EM28XX_NOADECODER = 0, 37615b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas EM28XX_TVAUDIO, 3778dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler}; 3788dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 379e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guystruct em28xx_board { 380e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy char *name; 381e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy int vchannels; 3820848e297c2107dbc12a91a1709c879c73bd188d8Wey-Yi Guy int tuner_type; 383e307ddce394ee7bcec41fb74330ac89eafaea1d9Wey-Yi Guy int tuner_addr; 3848dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 3858dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler /* i2c flags */ 3868dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler unsigned int tda9887_conf; 3878dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 3882fac9717a05fc4b4824422d2c439c1260807c110Reinette Chatre /* GPIO sequences */ 3898dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler struct em28xx_reg_seq *dvb_gpio; 3908dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler struct em28xx_reg_seq *suspend_gpio; 3918dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler struct em28xx_reg_seq *tuner_gpio; 3928dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler struct em28xx_reg_seq *mute_gpio; 3938dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler 3948dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler unsigned int is_em2800:1; 3958dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler unsigned int has_msp34xx:1; 3968dd266ef4eb51d034fa1c5f9307a9ff07547d8e6Tomas Winkler unsigned int mts_firmware:1; 397712b6cf57a53da608a682b5f782c5785bda76001Tomas Winkler unsigned int max_range_640_480:1; 398b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy unsigned int has_dvb:1; 399b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy unsigned int has_snapshot_button:1; 400b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy unsigned int is_webcam:1; 401b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy unsigned int valid:1; 402b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy unsigned int has_ir_i2c:1; 403b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy 404b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy unsigned char xclk, i2c_speed; 405b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy unsigned char radio_addr; 406b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy unsigned short tvaudio_addr; 407937c397eb633b804d9a806d08c395ecfc42b1fecWey-Yi Guy 408937c397eb633b804d9a806d08c395ecfc42b1fecWey-Yi Guy enum em28xx_decoder decoder; 409937c397eb633b804d9a806d08c395ecfc42b1fecWey-Yi Guy enum em28xx_adecoder adecoder; 410b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy 411b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy struct em28xx_input input[MAX_EM28XX_INPUT]; 412b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy struct em28xx_input radio; 413b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy struct ir_scancode_table *ir_codes; 414b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy}; 415b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy 416189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummerstruct em28xx_eeprom { 417189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer u32 id; /* 0x9567eb1a */ 418189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer u16 vendor_ID; 419189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer u16 product_ID; 420189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 421189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer u16 chip_conf; 422189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 423189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer u16 board_conf; 424189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 425189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer u16 string1, string2, string3; 426189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 427189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer u8 string_idx_table; 428189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer}; 429189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 430189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer/* device states */ 431189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummerenum em28xx_dev_state { 432b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy DEV_INITIALIZED = 0x01, 433b03d7d0fd3d23b7cf130fa702f4ae3b1bc827d4bWey-Yi Guy DEV_DISCONNECTED = 0x02, 434189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer DEV_MISCONFIGURED = 0x04, 435189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer}; 436189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer 437189a2b5942d62bd18e1e01772c4c784253f5dd16Ester Kummer#define EM28XX_AUDIO_BUFS 5 438d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_NUM_AUDIO_PACKETS 64 439d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */ 440d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_CAPTURE_STREAM_EN 1 441d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 442d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas/* em28xx extensions */ 44328f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten#define EM28XX_AUDIO 0x10 444d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_DVB 0x20 445d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 446d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas/* em28xx resource types (used for res_get/res_lock etc */ 447d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_RESOURCE_VIDEO 0x01 448d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas#define EM28XX_RESOURCE_VBI 0x02 449d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 450d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomasstruct em28xx_audio { 451d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas char name[50]; 452d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas char *transfer_buffer[EM28XX_AUDIO_BUFS]; 453d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas struct urb *urb[EM28XX_AUDIO_BUFS]; 454d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas struct usb_device *udev; 45515b1687cb4f45b87ddbe4dfc7759ff5bb69497d2Winkler, Tomas unsigned int capture_transfer_done; 456d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas struct snd_pcm_substream *capture_pcm_substream; 457d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 458d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas unsigned int hwptr_done_capture; 459d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas struct snd_card *sndcard; 460a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 461a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy int users; 462d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas enum em28xx_stream_state capture_stream; 463d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas spinlock_t slock; 464a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy}; 465a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 466d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomasstruct em28xx; 467a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 468a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guystruct em28xx_fh { 469a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy struct em28xx *dev; 470a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy int radio; 471a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy unsigned int resources; 472a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 473a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy struct videobuf_queue vb_vidq; 474a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy struct videobuf_queue vb_vbiq; 475a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 476a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy enum v4l2_buf_type type; 477a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy}; 478a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 479a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy/* main device struct */ 480a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guystruct em28xx { 481a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy /* generic device properties */ 482a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy char name[30]; /* name (including minor) of the device */ 483d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas int model; /* index in the device_data struct */ 484a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy int devno; /* marks the number of this device */ 485a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy enum em28xx_chip_id chip_id; 486d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 487d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas struct v4l2_device v4l2_dev; 488a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy struct em28xx_board board; 489a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 490a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy /* Webcam specific fields */ 491a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy enum em28xx_sensor em28xx_sensor; 492a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy int sensor_xres, sensor_yres; 493a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy int sensor_xtal; 494a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 495a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy /* Allows progressive (e. g. non-interlaced) mode */ 496a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy int progressive; 497a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 498a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy /* Vinmode/Vinctl used at the driver */ 499a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy int vinmode, vinctl; 500a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 501a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy unsigned int has_audio_class:1; 502a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy unsigned int has_alsa_audio:1; 503a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 504a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy struct em28xx_fmt *format; 505a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy 506a2e2322d83df82a57ba456cfa604c8b8f7b04670Wey-Yi Guy struct em28xx_IR *ir; 507d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 508d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas /* Some older em28xx chips needs a waiting time after writing */ 509d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas unsigned int wait_after_write; 510d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas 511d366df5abb8d5ce7e2c36d3b678177787ccd9749Winkler, Tomas struct list_head devlist; 51208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 51308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy u32 i2s_speed; /* I2S speed for audio digital stream */ 51408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 51508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy struct em28xx_audio_mode audio_mode; 51628f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten 51708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int tuner_type; /* type of the tuner */ 51808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int tuner_addr; /* tuner address */ 51908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int tda9887_conf; 52008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy /* i2c i/o */ 52108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy struct i2c_adapter i2c_adap; 52208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy struct i2c_client i2c_client; 52308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy /* video for linux */ 52408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int users; /* user count for exclusive use */ 52508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy struct video_device *vdev; /* video for linux device struct */ 52608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy v4l2_std_id norm; /* selected tv norm */ 5277812b16730ccebce71a3b2228ac08dd4f8b39469Wey-Yi Guy int ctl_freq; /* selected frequency */ 5287812b16730ccebce71a3b2228ac08dd4f8b39469Wey-Yi Guy unsigned int ctl_input; /* selected input */ 52908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy unsigned int ctl_ainput;/* selected audio input */ 53008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy unsigned int ctl_aoutput;/* selected audio output */ 53108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int mute; 53208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int volume; 53308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy /* frame properties */ 53408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int width; /* current frame width */ 53508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int height; /* current frame height */ 53608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy unsigned hscale; /* horizontal scale factor (see datasheet) */ 53708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy unsigned vscale; /* vertical scale factor (see datasheet) */ 53808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int interlaced; /* 1=interlace fileds, 0=just top fileds */ 53908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy unsigned int video_bytesread; /* Number of bytes read */ 54008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 54108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy unsigned long hash; /* eeprom hash - for boards with generic ID */ 54208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy unsigned long i2c_hash; /* i2c devicelist hash - 54308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy for boards with generic ID */ 54408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 54508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy struct em28xx_audio adev; 54608df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 54708df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy /* states */ 54808df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy enum em28xx_dev_state state; 54908df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy enum em28xx_io_method io; 55008df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy 55108df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy /* vbi related state tracking */ 55208df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int capture_type; 55308df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy int vbi_read; 55408df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy unsigned char cur_field; 55508df05aa9b25f3079585855506022bb33a011183Wey-Yi Guy unsigned int vbi_width; 556a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy unsigned int vbi_height; /* lines per field */ 557a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 558a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct work_struct request_module_wk; 559a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 56028f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten /* locks */ 561a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct mutex lock; 562a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct mutex ctrl_urb_lock; /* protects urb_buf */ 563a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy /* spinlock_t queue_lock; */ 564a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct list_head inqueue, outqueue; 565a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy wait_queue_head_t open, wait_frame, wait_stream; 566a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct video_device *vbi_dev; 567a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct video_device *radio_dev; 568a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 569a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy /* resources in use */ 570a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy unsigned int resources; 571a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 572a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy unsigned char eedata[256]; 573a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 574a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy /* Isoc control struct */ 575a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct em28xx_dmaqueue vidq; 576a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct em28xx_dmaqueue vbiq; 577a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct em28xx_usb_isoc_ctl isoc_ctl; 578a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy spinlock_t slock; 579a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 580a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy /* usb transfer */ 581a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct usb_device *udev; /* the usb device */ 582a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int alt; /* alternate */ 583a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int max_pkt_size; /* max packet size of isoc transaction */ 584a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int num_alt; /* Number of alternative settings */ 585a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ 586a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct urb *urb[EM28XX_NUM_BUFS]; /* urb for isoc transfers */ 587a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc 588a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy transfer */ 589a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char urb_buf[URB_MAX_CTRL_SIZE]; /* urb control msg buffer */ 590a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 591a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy /* helper funcs that call usb_control_msg */ 592a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int (*em28xx_write_regs) (struct em28xx *dev, u16 reg, 593a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char *buf, int len); 594a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int (*em28xx_read_reg) (struct em28xx *dev, u16 reg); 595a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg, 596a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char *buf, int len); 597a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg, 598a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char *buf, int len); 599a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg); 600a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 601a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy enum em28xx_mode mode; 602a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 603a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy /* register numbers for GPO/GPIO registers */ 604a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy u16 reg_gpo_num, reg_gpio_num; 605a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 606a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy /* Caches GPO and GPIO registers */ 607a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy unsigned char reg_gpo, reg_gpio; 608a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 609a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy /* Snapshot button */ 610a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char snapshot_button_path[30]; /* path of the input dev */ 611a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct input_dev *sbutton_input_dev; 612a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct delayed_work sbutton_query_work; 613a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 614a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct em28xx_dvb *dvb; 615a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 616a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy /* I2C keyboard data */ 617a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct IR_i2c_init_data init_data; 618a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy}; 619a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 620a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guystruct em28xx_ops { 621a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy struct list_head next; 622a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char *name; 623a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int id; 624a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int (*init)(struct em28xx *); 625a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int (*fini)(struct em28xx *); 626a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy}; 627a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 628a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy/* Provided by em28xx-i2c.c */ 629a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyvoid em28xx_do_i2c_scan(struct em28xx *dev); 630a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint em28xx_i2c_register(struct em28xx *dev); 631a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint em28xx_i2c_unregister(struct em28xx *dev); 632a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 633a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy/* Provided by em28xx-core.c */ 634a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 635a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyu32 em28xx_request_buffers(struct em28xx *dev, u32 count); 636a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyvoid em28xx_queue_unusedframes(struct em28xx *dev); 637a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyvoid em28xx_release_buffers(struct em28xx *dev); 638a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy 639a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg, 640a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy char *buf, int len); 641a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg); 642a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint em28xx_read_reg(struct em28xx *dev, u16 reg); 643a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guyint em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf, 644f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy int len); 645f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len); 646f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_write_reg(struct em28xx *dev, u16 reg, u8 val); 64728f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweetenint em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val, 648f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy u8 bitmask); 649f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy 650f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_read_ac97(struct em28xx *dev, u8 reg); 651f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_write_ac97(struct em28xx *dev, u8 reg, u16 val); 652f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy 653f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_audio_analog_set(struct em28xx *dev); 654f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_audio_setup(struct em28xx *dev); 655f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy 656f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_colorlevels_set_default(struct em28xx *dev); 657f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_capture_start(struct em28xx *dev, int start); 658f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_vbi_supported(struct em28xx *dev); 659f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_set_outfmt(struct em28xx *dev); 660f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_resolution_set(struct em28xx *dev); 661f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guyint em28xx_set_alternate(struct em28xx *dev); 6624967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guyint em28xx_init_isoc(struct em28xx *dev, int max_packets, 663f5ad69fa47e7b204d0032d569812544cd9a351fbWey-Yi Guy int num_bufs, int max_pkt_size, 664a83b9141b540f96dd59409c6487828e880113a29Wey-Yi Guy int (*isoc_copy) (struct em28xx *dev, struct urb *urb)); 665a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_uninit_isoc(struct em28xx *dev); 666a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyint em28xx_isoc_dvb_max_packetsize(struct em28xx *dev); 667a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyint em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode); 66828f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweetenint em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio); 669a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_wake_i2c(struct em28xx *dev); 670a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_remove_from_devlist(struct em28xx *dev); 671a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_add_into_devlist(struct em28xx *dev); 672a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyint em28xx_register_extension(struct em28xx_ops *dev); 673a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_unregister_extension(struct em28xx_ops *dev); 674a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_init_extension(struct em28xx *dev); 675a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_close_extension(struct em28xx *dev); 676a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy 677a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy/* Provided by em28xx-video.c */ 678a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyint em28xx_register_analog_devices(struct em28xx *dev); 679a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyvoid em28xx_release_analog_resources(struct em28xx *dev); 680a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy 681a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guy/* Provided by em28xx-cards.c */ 682a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyextern int em2800_variant_detect(struct usb_device *udev, int model); 683a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyextern void em28xx_pre_card_setup(struct em28xx *dev); 684a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyextern void em28xx_card_setup(struct em28xx *dev); 6854967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guyextern struct em28xx_board em28xx_boards[]; 686a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyextern struct usb_device_id em28xx_id_table[]; 687a283c0116b0cc5e82327e50ad4d05f6d4d42c603Wey-Yi Guyextern const unsigned int em28xx_bcount; 688fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyvoid em28xx_register_i2c_ir(struct em28xx *dev); 689fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyint em28xx_tuner_callback(void *ptr, int component, int command, int arg); 690fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyvoid em28xx_release_resources(struct em28xx *dev); 691fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 69228f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten/* Provided by em28xx-input.c */ 6933ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Bergint em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); 694fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyint em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); 695fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyint em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key, 696fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy u32 *ir_raw); 697fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyvoid em28xx_register_snapshot_button(struct em28xx *dev); 698fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyvoid em28xx_deregister_snapshot_button(struct em28xx *dev); 699fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 700fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyint em28xx_ir_init(struct em28xx *dev); 7013ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Bergint em28xx_ir_fini(struct em28xx *dev); 702fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 703fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy/* Provided by em28xx-vbi.c */ 704fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guyextern struct videobuf_queue_ops em28xx_vbi_qops; 7053ad3b92a5517c043ef30e4b95c4c39a35bbc36beJohannes Berg 706fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy/* printk macros */ 707fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 708fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy#define em28xx_err(fmt, arg...) do {\ 709fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy printk(KERN_ERR fmt , ##arg); } while (0) 710fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 711fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy#define em28xx_errdev(fmt, arg...) do {\ 712fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy printk(KERN_ERR "%s: "fmt,\ 713fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy dev->name , ##arg); } while (0) 714fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy 715fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy#define em28xx_info(fmt, arg...) do {\ 716fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy printk(KERN_INFO "%s: "fmt,\ 7174967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guy dev->name , ##arg); } while (0) 718fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy#define em28xx_warn(fmt, arg...) do {\ 719fbf3a2af3834e8e93e9c2876de62c5b49988e352Wey-Yi Guy printk(KERN_WARNING "%s: "fmt,\ 7201e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy dev->name , ##arg); } while (0) 7211e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7221e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_compression_disable(struct em28xx *dev) 7231e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 7241e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy /* side effect of disabling scaler and mixer */ 7251e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return em28xx_write_reg(dev, EM28XX_R26_COMPR, 0x00); 7261e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7271e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7281e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_contrast_get(struct em28xx *dev) 7291e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 7301e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f; 7311e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7321e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7331e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_brightness_get(struct em28xx *dev) 7341e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 7351e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return em28xx_read_reg(dev, EM28XX_R21_YOFFSET); 7361e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7371e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7381e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_saturation_get(struct em28xx *dev) 7391e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 7401e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f; 7411e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7421e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7431e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_u_balance_get(struct em28xx *dev) 7441e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 7451e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return em28xx_read_reg(dev, EM28XX_R23_UOFFSET); 7461e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7471e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7481e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_v_balance_get(struct em28xx *dev) 7491e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 75028f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten return em28xx_read_reg(dev, EM28XX_R24_VOFFSET); 7511e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7521e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7531e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guystatic inline int em28xx_gamma_get(struct em28xx *dev) 7541e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 7551e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f; 7561e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy} 7571e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy 7584967c31677cf3c6c49aadf205f1a31d15d7610daWey-Yi Guystatic inline int em28xx_contrast_set(struct em28xx *dev, s32 val) 7591e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy{ 7601e4247d457c6a42e4a05cb7dfa4e6ea1fa65c112Wey-Yi Guy u8 tmp = (u8) val; 761e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1); 762e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 763e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 764e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline int em28xx_brightness_set(struct em28xx *dev, s32 val) 765e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 766e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg u8 tmp = (u8) val; 767e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1); 768e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 769e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 770e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline int em28xx_saturation_set(struct em28xx *dev, s32 val) 771e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 772e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg u8 tmp = (u8) val; 773e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1); 774e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 775e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 776e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline int em28xx_u_balance_set(struct em28xx *dev, s32 val) 777e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 778e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg u8 tmp = (u8) val; 779e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1); 780e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 781e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 782e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline int em28xx_v_balance_set(struct em28xx *dev, s32 val) 7831a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre{ 7841a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre u8 tmp = (u8) val; 7851a34c043802a213e719420ece395cf25c85cc7c5Reinette Chatre return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1); 786e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 787e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 788e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline int em28xx_gamma_set(struct em28xx *dev, s32 val) 789e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg{ 790e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg u8 tmp = (u8) val; 7914ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1); 7924ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy} 7934ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy 794e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg/*FIXME: maxw should be dependent of alt mode */ 795e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline unsigned int norm_maxw(struct em28xx *dev) 796d3a571971e5af241074947fc80f6284677f6e014Reinette Chatre{ 7974ad177b5c860dc0b1083eccc55957daf4a116b90Wey-Yi Guy if (dev->board.is_webcam) 798d3a571971e5af241074947fc80f6284677f6e014Reinette Chatre return dev->sensor_xres; 799e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 800e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (dev->board.max_range_640_480 || dev->board.is_em2800) 801e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return 640; 802e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 803e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return 720; 804e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 805e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 806e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Bergstatic inline unsigned int norm_maxh(struct em28xx *dev) 80728f63a4bb744ea81030219aba2337fddb10b380bH Hartley Sweeten{ 808e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (dev->board.is_webcam) 809e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return dev->sensor_yres; 810e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 811e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg if (dev->board.max_range_640_480) 812e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return 480; 813e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg 814e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg return (dev->norm & V4L2_STD_625_50) ? 576 : 480; 815e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg} 816e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg#endif 817e312c24cf8229f9b6e76dbfd5d99eefe21f4ac0aJohannes Berg