em28xx.h revision 7e48b30af033076c85ab48a8306b5588faf5fb4b
1a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* 20e7072ef6623c3dc58faf3f7310aba77b0a5845eMichael Krufky em28xx.h - driver for Empia EM2800/EM2820/2840 USB video capture devices 3a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 4a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com> 54ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab Ludovico Cavedon <cavedon@sssup.it> 62e7c6dc3989136844eb63e05f9e4dc6608a763c6Mauro Carvalho Chehab Mauro Carvalho Chehab <mchehab@infradead.org> 7a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 8a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Based on the em2800 driver from Sascha Sommer <saschasommer@freenet.de> 9a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 10a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton This program is free software; you can redistribute it and/or modify 11a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton it under the terms of the GNU General Public License as published by 12a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton the Free Software Foundation; either version 2 of the License, or 13a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton (at your option) any later version. 14a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 15a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton This program is distributed in the hope that it will be useful, 16a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton but WITHOUT ANY WARRANTY; without even the implied warranty of 17a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton GNU General Public License for more details. 19a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 20a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton You should have received a copy of the GNU General Public License 21a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton along with this program; if not, write to the Free Software 22a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton */ 24a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 253acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#ifndef _EM28XX_H 263acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define _EM28XX_H 27a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 28cb77d010221e66c63f4a71546fed73be9b12b9a3Mauro Carvalho Chehab#include <linux/videodev2.h> 29ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab#include <media/videobuf-vmalloc.h> 30f2cf250af156bef127433efd255abfae6aab02f6Douglas Schilling Landgraf#include <media/v4l2-device.h> 31ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 32a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#include <linux/i2c.h> 333593cab5d62c4c7abced1076710f9bc2d8847433Ingo Molnar#include <linux/mutex.h> 34d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab#include <media/ir-kbd-i2c.h> 35a469585b1cd41e6efd5c2746a655feb840525e5cDavid Härdeman#include <media/ir-core.h> 363aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE) 373aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#include <media/videobuf-dvb.h> 383aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#endif 393ca9c09379e8f3be0744c47f72769457fa46e9f3Mauro Carvalho Chehab#include "tuner-xc2028.h" 402ba890ec0849b222a6dabb5192ccd8fd1696d6d3Mauro Carvalho Chehab#include "em28xx-reg.h" 413aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 423aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* Boards supported by driver */ 433aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_UNKNOWN 0 443aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_UNKNOWN 1 453aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_TERRATEC_CINERGY_250 2 463aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PINNACLE_USB_2 3 473aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 4 483aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_MSI_VOX_USB_2 5 493aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_TERRATEC_CINERGY_200 6 503aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_LEADTEK_WINFAST_USBII 7 513aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_KWORLD_USB2800 8 523aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PINNACLE_DVC_90 9 533aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 10 543aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_TERRATEC_HYBRID_XS 11 553aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_KWORLD_PVRTV2800RF 12 563aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_TERRATEC_PRODIGY_XS 13 573aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PROLINK_PLAYTV_USB2 14 583aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_VGEAR_POCKETTV 15 5910ac6603613d46a43a4544fbbe9581e50879bd45Mauro Carvalho Chehab#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 16 604fd305b2a2c4d16e8d4ebc95c84f946edd3385c5Devin Heitmueller#define EM2880_BOARD_PINNACLE_PCTV_HD_PRO 17 6117d9d558e818530cc7d210ffea575a36f48eaa1aDevin Heitmueller#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 18 623ed58baf5db4eab553803916a990a3dbca4dc611Devin Heitmueller#define EM2860_BOARD_SAA711X_REFERENCE_DESIGN 19 63e14b3658a7651ffd9b1f407eaf07f4dde17ef1e7Devin Heitmueller#define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 20 6459d07f1b705c466ea4eaca9c43d46be6d6a065a4Aron Szabo#define EM2800_BOARD_GRABBEEX_USB2800 21 6595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2750_BOARD_UNKNOWN 22 6695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2750_BOARD_DLCW_130 23 6795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_DLINK_USB_TV 24 6895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_GADMEI_UTV310 25 6995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_HERCULES_SMART_TV_USB2 26 7095b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_PINNACLE_USB_2_FM1216ME 27 7195b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28 72443fed9fa42bbeacdb8d336b8a5002a262cac15cDevin Heitmueller#define EM2860_BOARD_TVP5150_REFERENCE_DESIGN 29 7395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_VIDEOLOGY_20K14XUSB 30 7495b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2821_BOARD_USBGEAR_VD204 31 7595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2821_BOARD_SUPERCOMP_USB_2 32 7695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_TERRATEC_HYBRID_XS 34 7795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_TYPHOON_DVD_MAKER 35 7895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_NETGMBH_CAM 36 7995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_GADMEI_UTV330 37 8095b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2861_BOARD_YAKUMO_MOVIE_MIXER 38 8195b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2861_BOARD_KWORLD_PVRTV_300U 39 8295b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2861_BOARD_PLEXTOR_PX_TV100U 40 8395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_KWORLD_350U 41 8495b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_KWORLD_355U 42 8595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_TERRATEC_XS 43 8695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_TERRATEC_XS_MT2060 44 8795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_PINNACLE_PCTV_DVB 45 8895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_COMPRO_VIDEOMATE 46 8995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_KWORLD_DVB_305U 47 9095b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_KWORLD_DVB_310U 48 9195b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_MSI_DIGIVOX_AD 49 9295b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_MSI_DIGIVOX_AD_II 50 9395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_TERRATEC_HYBRID_XS_FR 51 9495b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2881_BOARD_DNT_DA2_HYBRID 52 9595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2881_BOARD_PINNACLE_HYBRID_PRO 53 9695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2882_BOARD_KWORLD_VS_DVBT 54 9795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2882_BOARD_TERRATEC_HYBRID_XS 55 9895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2882_BOARD_PINNACLE_HYBRID_PRO 56 996e7b9ea0937eeb75fa166ef7bd22b5f3bb5676d1Robert Krakora#define EM2883_BOARD_KWORLD_HYBRID_330U 57 100ee281b856d4e4921da24387ab116bb0855c2efaaMauro Carvalho Chehab#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU 58 101f89bc32974a4376e8393001484af28d8c3350ab4Douglas Schilling Landgraf#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 60 1021e1addd57bdf56c51dbc292d7760ea3d207fe833Douglas Schilling Landgraf#define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2 61 103f7fe3e6f3c3e9ef6ba5ca187b514d225296d18ddDouglas Schilling Landgraf#define EM2820_BOARD_GADMEI_TVR200 62 10456ee38071fe0cf1746d53c5b40a46a835b24fbe4Mauro Carvalho Chehab#define EM2860_BOARD_KAIOMY_TVNPC_U2 63 10556ee38071fe0cf1746d53c5b40a46a835b24fbe4Mauro Carvalho Chehab#define EM2860_BOARD_EASYCAP 64 106f74a61e3c6f218053742c2caf3e247fb41bf395eIndika Katugampala#define EM2820_BOARD_IODATA_GVMVP_SZ 65 107e5db5d44432abc82b1250dd05bd0a4b011392d9dDouglas Schilling Landgraf#define EM2880_BOARD_EMPIRE_DUAL_TV 66 1084557af9c5338605c85fe54f5ebba3d4b14a60ab8Mauro Carvalho Chehab#define EM2860_BOARD_TERRATEC_GRABBY 67 109766ed64de554fda08ceb927d36279eabcb08acb3Mauro Carvalho Chehab#define EM2860_BOARD_TERRATEC_AV350 68 110d7de5d8ff74efd01916b01af875a0e87419a3599Franklin Meng#define EM2882_BOARD_KWORLD_ATSC_315U 69 11119859229d7d98bc2d582ff45045dd7f73d649383Devin Heitmueller#define EM2882_BOARD_EVGA_INDTUBE 70 11202e7804b2135ff941b8846f5820cf48fbfdadd54Mauro Carvalho Chehab#define EM2820_BOARD_SILVERCREST_WEBCAM 71 1136d888a66be1c50c2f5193c53d6ea556e01dd60e3Mauro Carvalho Chehab#define EM2861_BOARD_GADMEI_UTV330PLUS 72 114285eb1a40242adb3feaf9c73d352cbfeee1bea1cAntti Palosaari#define EM2870_BOARD_REDDO_DVB_C_USB_BOX 73 115694a101e6acb865f5405a95c358eea43c813cf24Mauro Carvalho Chehab#define EM2800_BOARD_VC211A 74 1167ca7ef6011e92b52a365ddc78f6668e01793c572Andrea.Amorosi#define EM2882_BOARD_DIKOM_DK300 75 1177e48b30af033076c85ab48a8306b5588faf5fb4bJarod Wilson#define EM2870_BOARD_KWORLD_A340 76 1183aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 1193aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* Limits minimum and default number of buffers */ 1203aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_MIN_BUF 4 1213aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_DEF_BUF 8 122a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 123c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab/*Limits the max URB message size */ 124c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab#define URB_MAX_CTRL_SIZE 80 125c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab 12695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf/* Params for validated field */ 12795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM28XX_BOARD_NOT_VALIDATED 1 12895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM28XX_BOARD_VALIDATED 0 12995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf 13022cff7b381eca256d2afb460b3b9815f83810011Douglas Schilling Landgraf/* Params for em28xx_cmd() audio */ 13122cff7b381eca256d2afb460b3b9815f83810011Douglas Schilling Landgraf#define EM28XX_START_AUDIO 1 13222cff7b381eca256d2afb460b3b9815f83810011Douglas Schilling Landgraf#define EM28XX_STOP_AUDIO 0 13322cff7b381eca256d2afb460b3b9815f83810011Douglas Schilling Landgraf 134596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab/* maximum number of em28xx boards */ 1353687e1e67e4920a202d53cc24678fb34fcda8fc5Mauro Carvalho Chehab#define EM28XX_MAXBOARDS 4 /*FIXME: should be bigger */ 136596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab 137a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* maximum number of frames that can be queued */ 1383acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_FRAMES 5 139a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* number of frames that get used for v4l2_read() */ 1403acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_READ_FRAMES 2 141a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 142a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* number of buffers for isoc transfers */ 1433acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_BUFS 5 144a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 145d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab/* number of packets for each buffer 14633c02facb5a3123212587295cc1c241ee7e03adbDevin Heitmueller windows requests only 64 packets .. so we better do the same 147d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab this is what I found out for all alternate numbers there! 148d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab */ 14933c02facb5a3123212587295cc1c241ee7e03adbDevin Heitmueller#define EM28XX_NUM_PACKETS 64 150a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 1513acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_INTERLACED_DEFAULT 1 152a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 153a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* 154a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define (use usbview if you want to get the other alternate number infos) 155a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define 156a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define alternate number 2 157a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define Endpoint Address: 82 158a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Direction: in 159a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Attribute: 1 160a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Type: Isoc 161a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Max Packet Size: 1448 162a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Interval: 125us 163a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 164a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton alternate number 7 165a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 166a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Endpoint Address: 82 167a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Direction: in 168a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Attribute: 1 169a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Type: Isoc 170a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Max Packet Size: 3072 171a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Interval: 125us 172a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton*/ 173a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 174a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* time to wait when stopping the isoc transfer */ 175a1a6ee74f2c68918f2e145dccba3637eea91a52aNicola Soranzo#define EM28XX_URB_TIMEOUT \ 176a1a6ee74f2c68918f2e145dccba3637eea91a52aNicola Soranzo msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS) 177a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 178596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab/* time in msecs to wait for i2c writes to finish */ 179596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab#define EM2800_I2C_WRITE_TIMEOUT 20 180596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab 1813aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehabenum em28xx_mode { 1822fe3e2ee72ef17daad1d3769321bb7dd69a003a9Mauro Carvalho Chehab EM28XX_SUSPEND, 1833aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab EM28XX_ANALOG_MODE, 1843aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab EM28XX_DIGITAL_MODE, 1853aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab}; 1863aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 1873acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_stream_state { 188a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton STREAM_OFF, 189a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton STREAM_INTERRUPT, 190a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton STREAM_ON, 191a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 192a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 193579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonstruct em28xx; 194579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton 195ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_usb_isoc_ctl { 196ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* max packet size of isoc transaction */ 197ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int max_pkt_size; 198ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 199ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* number of allocated urbs */ 200ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int num_bufs; 201ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 202ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* urb for isoc transfers */ 203ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct urb **urb; 204ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 205ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* transfer buffers for isoc transfer */ 206ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab char **transfer_buffer; 207ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 208ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Last buffer command and region */ 209ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab u8 cmd; 210ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int pos, size, pktsize; 211ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 212ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Last field: ODD or EVEN? */ 213ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int field; 214ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 215ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Stores incomplete commands */ 216ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab u32 tmp_buf; 217ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int tmp_buf_len; 218ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 219ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Stores already requested buffers */ 22028abf083d356bc4ec459ded7a95b6a22a20f6c3dDevin Heitmueller struct em28xx_buffer *vid_buf; 22128abf083d356bc4ec459ded7a95b6a22a20f6c3dDevin Heitmueller struct em28xx_buffer *vbi_buf; 222ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 223ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Stores the number of received fields */ 224ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int nfields; 225579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton 226579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton /* isoc urb callback */ 227579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton int (*isoc_copy) (struct em28xx *dev, struct urb *urb); 228579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton 229ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab}; 230ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 231bddcf63313c6a4a85f94db092f45e31f530da691Mauro Carvalho Chehab/* Struct to enumberate video formats */ 232ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_fmt { 233ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab char *name; 234ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab u32 fourcc; /* v4l2 format id */ 235bddcf63313c6a4a85f94db092f45e31f530da691Mauro Carvalho Chehab int depth; 236bddcf63313c6a4a85f94db092f45e31f530da691Mauro Carvalho Chehab int reg; 237ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab}; 238ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 239ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab/* buffer for one video frame */ 240ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_buffer { 241ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* common v4l buffer stuff -- must be first */ 242ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct videobuf_buffer vb; 243ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 244a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct list_head frame; 245a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int top_field; 246ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int receiving; 247ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab}; 248ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 249ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_dmaqueue { 250ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct list_head active; 251ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct list_head queued; 252ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 253ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab wait_queue_head_t wq; 254ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 255ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Counters to control buffer fill */ 256ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int pos; 257a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 258a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 259a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* io methods */ 2603acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_io_method { 261a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton IO_NONE, 262a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton IO_READ, 263a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton IO_MMAP, 264a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 265a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 266a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* inputs */ 267a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 2683acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define MAX_EM28XX_INPUT 4 2693acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum enum28xx_itype { 2703acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_COMPOSITE1 = 1, 2713acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_COMPOSITE2, 2723acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_COMPOSITE3, 2733acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_COMPOSITE4, 2743acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_SVIDEO, 2753acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_TELEVISION, 2763acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_CABLE, 2773acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_DVB, 2783acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_DEBUG, 2793acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_RADIO, 280a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 281a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 28235643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehabenum em28xx_ac97_mode { 28335643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab EM28XX_NO_AC97 = 0, 28435643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab EM28XX_AC97_EM202, 285209acc02249d831e7f2e3d8083b6b562dde5fc6fMauro Carvalho Chehab EM28XX_AC97_SIGMATEL, 28635643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab EM28XX_AC97_OTHER, 28735643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab}; 28835643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab 28935643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehabstruct em28xx_audio_mode { 29035643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab enum em28xx_ac97_mode ac97; 29135643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab 29235643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab u16 ac97_feat; 29316c7bcadff2222b297d13951dc30e133f56d0154Mauro Carvalho Chehab u32 ac97_vendor_id; 29435643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab 29535643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab unsigned int has_audio:1; 29635643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab 29735643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab unsigned int i2s_3rates:1; 29835643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab unsigned int i2s_5rates:1; 2995c2231c84304563fd5d28e8bbb72e09e882a8e32Devin Heitmueller}; 3005c2231c84304563fd5d28e8bbb72e09e882a8e32Devin Heitmueller 3015faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab/* em28xx has two audio inputs: tuner and line in. 3025faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab However, on most devices, an auxiliary AC97 codec device is used. 3035faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab The AC97 device may have several different inputs and outputs, 3045faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab depending on their model. So, it is possible to use AC97 mixer to 3055faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab address more than two different entries. 3065faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab */ 307539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehabenum em28xx_amux { 3085faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab /* This is the only entry for em28xx tuner input */ 3095faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_VIDEO, /* em28xx tuner, AC97 mixer Video */ 3105faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab 3115faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_LINE_IN, /* AC97 mixer Line In */ 3125faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab 3135faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab /* Some less-common mixer setups */ 3145faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_VIDEO2, /* em28xx Line in, AC97 mixer Video */ 3155faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_PHONE, 3165faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_MIC, 3175faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_CD, 3185faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_AUX, 3195faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_PCM_OUT, 320539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab}; 321539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab 32235ae6f04ad3e4c3ed8a83382b6511bd9beb5c768Mauro Carvalho Chehabenum em28xx_aout { 3238866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab /* AC97 outputs */ 324e879b8ebb000298f8124fc8fae570afc9eb37cbbMauro Carvalho Chehab EM28XX_AOUT_MASTER = 1 << 0, 325e879b8ebb000298f8124fc8fae570afc9eb37cbbMauro Carvalho Chehab EM28XX_AOUT_LINE = 1 << 1, 326e879b8ebb000298f8124fc8fae570afc9eb37cbbMauro Carvalho Chehab EM28XX_AOUT_MONO = 1 << 2, 327e879b8ebb000298f8124fc8fae570afc9eb37cbbMauro Carvalho Chehab EM28XX_AOUT_LFE = 1 << 3, 328e879b8ebb000298f8124fc8fae570afc9eb37cbbMauro Carvalho Chehab EM28XX_AOUT_SURR = 1 << 4, 3298866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab 3308866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab /* PCM IN Mixer - used by AC97_RECORD_SELECT register */ 3318866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab EM28XX_AOUT_PCM_IN = 1 << 7, 3328866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab 3338866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab /* Bits 10-8 are used to indicate the PCM IN record select */ 3348866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab EM28XX_AOUT_PCM_MIC_PCM = 0 << 8, 3358866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab EM28XX_AOUT_PCM_CD = 1 << 8, 3368866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab EM28XX_AOUT_PCM_VIDEO = 2 << 8, 3378866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab EM28XX_AOUT_PCM_AUX = 3 << 8, 3388866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab EM28XX_AOUT_PCM_LINE = 4 << 8, 3398866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab EM28XX_AOUT_PCM_STEREO = 5 << 8, 3408866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab EM28XX_AOUT_PCM_MONO = 6 << 8, 3418866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab EM28XX_AOUT_PCM_PHONE = 7 << 8, 34235ae6f04ad3e4c3ed8a83382b6511bd9beb5c768Mauro Carvalho Chehab}; 34335ae6f04ad3e4c3ed8a83382b6511bd9beb5c768Mauro Carvalho Chehab 34432929fb4c7c4a693ed723253b21e7bf3c8cb4b1cHans Verkuilstatic inline int ac97_return_record_select(int a_out) 3458866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab{ 3468866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab return (a_out & 0x700) >> 8; 3478866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab} 3488866f9cf8d85f3614855a49b9d9056f265d0cd33Mauro Carvalho Chehab 349122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehabstruct em28xx_reg_seq { 350122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab int reg; 351122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab unsigned char val, mask; 352122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab int sleep; 353122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab}; 354122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab 3553acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_input { 3563acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab enum enum28xx_itype type; 357a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned int vmux; 358539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab enum em28xx_amux amux; 35935ae6f04ad3e4c3ed8a83382b6511bd9beb5c768Mauro Carvalho Chehab enum em28xx_aout aout; 360122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab struct em28xx_reg_seq *gpio; 361a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 362a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 3633acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define INPUT(nr) (&em28xx_boards[dev->model].input[nr]) 364a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 3653acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_decoder { 366527f09a981e398331c2f8d8f7af83cd46e6a06ccMauro Carvalho Chehab EM28XX_NODECODER = 0, 3673acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_TVP5150, 368ec5de990d912c0d5cca98e030bf6447c1529f56dMauro Carvalho Chehab EM28XX_SAA711X, 369527f09a981e398331c2f8d8f7af83cd46e6a06ccMauro Carvalho Chehab}; 370527f09a981e398331c2f8d8f7af83cd46e6a06ccMauro Carvalho Chehab 371527f09a981e398331c2f8d8f7af83cd46e6a06ccMauro Carvalho Chehabenum em28xx_sensor { 372527f09a981e398331c2f8d8f7af83cd46e6a06ccMauro Carvalho Chehab EM28XX_NOSENSOR = 0, 37302e7804b2135ff941b8846f5820cf48fbfdadd54Mauro Carvalho Chehab EM28XX_MT9V011, 374b80fd2d811b48a92051f86d257b00f373e69a6d7Mauro Carvalho Chehab EM28XX_MT9M001, 375f2e26ae7c8c077d001c77b330130f98e42ccad70Mauro Carvalho Chehab EM28XX_MT9M111, 376a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 377a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 378df7fa09cca9d80f746c29f95b09a7223f6c2f4e7Mauro Carvalho Chehabenum em28xx_adecoder { 379df7fa09cca9d80f746c29f95b09a7223f6c2f4e7Mauro Carvalho Chehab EM28XX_NOADECODER = 0, 380df7fa09cca9d80f746c29f95b09a7223f6c2f4e7Mauro Carvalho Chehab EM28XX_TVAUDIO, 381df7fa09cca9d80f746c29f95b09a7223f6c2f4e7Mauro Carvalho Chehab}; 382df7fa09cca9d80f746c29f95b09a7223f6c2f4e7Mauro Carvalho Chehab 3833acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_board { 384a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton char *name; 385505b6d0b774fa4475fedbd3cebf95199c17a0086Mauro Carvalho Chehab int vchannels; 386a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int tuner_type; 38766767920e3e6532db8afe04f9b2d8e1a9e95cad9Mauro Carvalho Chehab int tuner_addr; 388a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 389a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* i2c flags */ 390a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned int tda9887_conf; 391a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 392017ab4b1e2aa31dc9fe986ab6d1f5ffa2a84395bMauro Carvalho Chehab /* GPIO sequences */ 393122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab struct em28xx_reg_seq *dvb_gpio; 3942fe3e2ee72ef17daad1d3769321bb7dd69a003a9Mauro Carvalho Chehab struct em28xx_reg_seq *suspend_gpio; 395017ab4b1e2aa31dc9fe986ab6d1f5ffa2a84395bMauro Carvalho Chehab struct em28xx_reg_seq *tuner_gpio; 3962bd1d9eb1c27034a77c8e1887156da72d6160ae1Vitaly Wool struct em28xx_reg_seq *mute_gpio; 397122b77e59ed2de0692dfe45c87a93e98156fe03aMauro Carvalho Chehab 39874f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab unsigned int is_em2800:1; 399a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned int has_msp34xx:1; 4005add9a6f3c90680f89b4694e81025d2aed9559afMauro Carvalho Chehab unsigned int mts_firmware:1; 401c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab unsigned int max_range_640_480:1; 4023aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab unsigned int has_dvb:1; 403a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller unsigned int has_snapshot_button:1; 404c43221df762c33e832e8855cae77989b6bf69fa6Mauro Carvalho Chehab unsigned int is_webcam:1; 40595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf unsigned int valid:1; 406ac07bb73fe226ae2088f060c63829afddb3f2403Mauro Carvalho Chehab unsigned int has_ir_i2c:1; 4073abee53e4402b6ae39e1e610f9ef94eb74097138Mauro Carvalho Chehab 408a2070c665459ac37a36bebae5e97bb4a2568990eMauro Carvalho Chehab unsigned char xclk, i2c_speed; 409f2cf250af156bef127433efd255abfae6aab02f6Douglas Schilling Landgraf unsigned char radio_addr; 410f2cf250af156bef127433efd255abfae6aab02f6Douglas Schilling Landgraf unsigned short tvaudio_addr; 411a2070c665459ac37a36bebae5e97bb4a2568990eMauro Carvalho Chehab 4123acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab enum em28xx_decoder decoder; 413df7fa09cca9d80f746c29f95b09a7223f6c2f4e7Mauro Carvalho Chehab enum em28xx_adecoder adecoder; 414a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 4153acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab struct em28xx_input input[MAX_EM28XX_INPUT]; 4160be4375410f1ecc917f3c0caf8f98908d357c93fMauro Carvalho Chehab struct em28xx_input radio; 41702858eedcb78a664215b918d98cdb753ce432ce6Mauro Carvalho Chehab char *ir_codes; 418a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 419a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 4203acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_eeprom { 421a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u32 id; /* 0x9567eb1a */ 422a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u16 vendor_ID; 423a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u16 product_ID; 424a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 425a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u16 chip_conf; 426a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 427a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u16 board_conf; 428a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 429a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u16 string1, string2, string3; 430a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 431a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 string_idx_table; 432a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 433a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 434a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* device states */ 4353acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_dev_state { 436a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton DEV_INITIALIZED = 0x01, 437a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton DEV_DISCONNECTED = 0x02, 438a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton DEV_MISCONFIGURED = 0x04, 439a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 440a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 4416d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO_BUFS 5 4426d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_NUM_AUDIO_PACKETS 64 4436d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */ 4446d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_CAPTURE_STREAM_EN 1 4453aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 4463aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* em28xx extensions */ 4476d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO 0x10 4483aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_DVB 0x20 4496d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 4508c873d31af868b4e340defc7053945636c8bd0e1Devin Heitmueller/* em28xx resource types (used for res_get/res_lock etc */ 4518c873d31af868b4e340defc7053945636c8bd0e1Devin Heitmueller#define EM28XX_RESOURCE_VIDEO 0x01 4528c873d31af868b4e340defc7053945636c8bd0e1Devin Heitmueller#define EM28XX_RESOURCE_VBI 0x02 4538c873d31af868b4e340defc7053945636c8bd0e1Devin Heitmueller 4546d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabstruct em28xx_audio { 4556d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab char name[50]; 4566d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab char *transfer_buffer[EM28XX_AUDIO_BUFS]; 4576d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab struct urb *urb[EM28XX_AUDIO_BUFS]; 4586d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab struct usb_device *udev; 4596d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab unsigned int capture_transfer_done; 4606d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab struct snd_pcm_substream *capture_pcm_substream; 4616d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 4626d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab unsigned int hwptr_done_capture; 4636d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab struct snd_card *sndcard; 4646d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 465c744dff260e9efb1080d1e823e588f85176a057bRobert Krakora int users; 4666d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab enum em28xx_stream_state capture_stream; 4676d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab spinlock_t slock; 4686d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab}; 4696d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 47052284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehabstruct em28xx; 47152284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab 47252284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehabstruct em28xx_fh { 47352284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab struct em28xx *dev; 47452284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab int radio; 4758c873d31af868b4e340defc7053945636c8bd0e1Devin Heitmueller unsigned int resources; 47652284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab 47752284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab struct videobuf_queue vb_vidq; 47828abf083d356bc4ec459ded7a95b6a22a20f6c3dDevin Heitmueller struct videobuf_queue vb_vbiq; 47952284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab 48052284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab enum v4l2_buf_type type; 48152284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab}; 48252284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab 483a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* main device struct */ 4843acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx { 485a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* generic device properties */ 486a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton char name[30]; /* name (including minor) of the device */ 487a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int model; /* index in the device_data struct */ 488e5589befc472ca50882f37c4fb32333fc93a65b7Mauro Carvalho Chehab int devno; /* marks the number of this device */ 489600bd7f0edee0f9687c3c77e6fe63c74452acbfaDevin Heitmueller enum em28xx_chip_id chip_id; 490505b6d0b774fa4475fedbd3cebf95199c17a0086Mauro Carvalho Chehab 491f2cf250af156bef127433efd255abfae6aab02f6Douglas Schilling Landgraf struct v4l2_device v4l2_dev; 492505b6d0b774fa4475fedbd3cebf95199c17a0086Mauro Carvalho Chehab struct em28xx_board board; 493505b6d0b774fa4475fedbd3cebf95199c17a0086Mauro Carvalho Chehab 494d36bb4e77257ed0df86deca3f69794f037f68c7dMauro Carvalho Chehab /* Webcam specific fields */ 495527f09a981e398331c2f8d8f7af83cd46e6a06ccMauro Carvalho Chehab enum em28xx_sensor em28xx_sensor; 4965569996421fa1cfc1fc0d9e683ac1def46ea985dMauro Carvalho Chehab int sensor_xres, sensor_yres; 497d36bb4e77257ed0df86deca3f69794f037f68c7dMauro Carvalho Chehab int sensor_xtal; 498527f09a981e398331c2f8d8f7af83cd46e6a06ccMauro Carvalho Chehab 499c2a6b54a9cf08d4ffeb75d70603c4a5d03ac97adMauro Carvalho Chehab /* Allows progressive (e. g. non-interlaced) mode */ 500c2a6b54a9cf08d4ffeb75d70603c4a5d03ac97adMauro Carvalho Chehab int progressive; 501c2a6b54a9cf08d4ffeb75d70603c4a5d03ac97adMauro Carvalho Chehab 502579d315218e8a3f696e375c5f6917da6488bec8aMauro Carvalho Chehab /* Vinmode/Vinctl used at the driver */ 503579d315218e8a3f696e375c5f6917da6488bec8aMauro Carvalho Chehab int vinmode, vinctl; 504579d315218e8a3f696e375c5f6917da6488bec8aMauro Carvalho Chehab 505d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab unsigned int has_audio_class:1; 50624a613e4b08c4077b4c809bebab1d4a36d541fccDevin Heitmueller unsigned int has_alsa_audio:1; 507a2070c665459ac37a36bebae5e97bb4a2568990eMauro Carvalho Chehab 508bddcf63313c6a4a85f94db092f45e31f530da691Mauro Carvalho Chehab struct em28xx_fmt *format; 509bddcf63313c6a4a85f94db092f45e31f530da691Mauro Carvalho Chehab 510a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehab struct em28xx_IR *ir; 511a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehab 51289b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab /* Some older em28xx chips needs a waiting time after writing */ 51389b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab unsigned int wait_after_write; 51489b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab 51574f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab struct list_head devlist; 51674f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab 5179bb13a6dc3a6f68c990264838ff0493d900c48d7Mauro Carvalho Chehab u32 i2s_speed; /* I2S speed for audio digital stream */ 5189bb13a6dc3a6f68c990264838ff0493d900c48d7Mauro Carvalho Chehab 51935643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab struct em28xx_audio_mode audio_mode; 520a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 521a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int tuner_type; /* type of the tuner */ 522a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int tuner_addr; /* tuner address */ 523a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int tda9887_conf; 524a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* i2c i/o */ 525a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct i2c_adapter i2c_adap; 526a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct i2c_client i2c_client; 527a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* video for linux */ 528a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int users; /* user count for exclusive use */ 529a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct video_device *vdev; /* video for linux device struct */ 5307d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab v4l2_std_id norm; /* selected tv norm */ 531a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int ctl_freq; /* selected frequency */ 532a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned int ctl_input; /* selected input */ 53395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf unsigned int ctl_ainput;/* selected audio input */ 53435ae6f04ad3e4c3ed8a83382b6511bd9beb5c768Mauro Carvalho Chehab unsigned int ctl_aoutput;/* selected audio output */ 535a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int mute; 536a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int volume; 537a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* frame properties */ 538a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int width; /* current frame width */ 539a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int height; /* current frame height */ 540d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuil unsigned hscale; /* horizontal scale factor (see datasheet) */ 541d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuil unsigned vscale; /* vertical scale factor (see datasheet) */ 542a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int interlaced; /* 1=interlace fileds, 0=just top fileds */ 5439e31ced888d1ca49ec5be51ef295e3ce994366c4Mauro Carvalho Chehab unsigned int video_bytesread; /* Number of bytes read */ 544a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 54503910cc39035d27f4c85c8ad2a236cc5c9456127Mauro Carvalho Chehab unsigned long hash; /* eeprom hash - for boards with generic ID */ 5466ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf unsigned long i2c_hash; /* i2c devicelist hash - 5476ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf for boards with generic ID */ 54803910cc39035d27f4c85c8ad2a236cc5c9456127Mauro Carvalho Chehab 5499baed99ee7a834b1f2599e13f219087f01c63f38Mauro Carvalho Chehab struct em28xx_audio adev; 5506d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 551a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* states */ 5523acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab enum em28xx_dev_state state; 5533acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab enum em28xx_io_method io; 5549e31ced888d1ca49ec5be51ef295e3ce994366c4Mauro Carvalho Chehab 555da52a55cff643b8e0b346b9894adf5b93946040dDevin Heitmueller /* vbi related state tracking */ 556da52a55cff643b8e0b346b9894adf5b93946040dDevin Heitmueller int capture_type; 557da52a55cff643b8e0b346b9894adf5b93946040dDevin Heitmueller int vbi_read; 558da52a55cff643b8e0b346b9894adf5b93946040dDevin Heitmueller unsigned char cur_field; 55966d9cbad5330d6df30c82f10ee18b62b096b84efDevin Heitmueller unsigned int vbi_width; 56066d9cbad5330d6df30c82f10ee18b62b096b84efDevin Heitmueller unsigned int vbi_height; /* lines per field */ 561da52a55cff643b8e0b346b9894adf5b93946040dDevin Heitmueller 562d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab struct work_struct request_module_wk; 563d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab 564a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* locks */ 5655a80415bcabf2b59e8c34db6e743c54582cfd3c2Sascha Sommer struct mutex lock; 566f2a2e4910502e866833732f31ee697d15b3e56fdMauro Carvalho Chehab struct mutex ctrl_urb_lock; /* protects urb_buf */ 567d7aa80207babe694b316a48200b096cf0336ecb3Aidan Thornton /* spinlock_t queue_lock; */ 568a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct list_head inqueue, outqueue; 569a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton wait_queue_head_t open, wait_frame, wait_stream; 570a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct video_device *vbi_dev; 5710be4375410f1ecc917f3c0caf8f98908d357c93fMauro Carvalho Chehab struct video_device *radio_dev; 572a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 5738c873d31af868b4e340defc7053945636c8bd0e1Devin Heitmueller /* resources in use */ 5748c873d31af868b4e340defc7053945636c8bd0e1Devin Heitmueller unsigned int resources; 5758c873d31af868b4e340defc7053945636c8bd0e1Devin Heitmueller 576a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned char eedata[256]; 577a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 578ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Isoc control struct */ 579ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct em28xx_dmaqueue vidq; 58028abf083d356bc4ec459ded7a95b6a22a20f6c3dDevin Heitmueller struct em28xx_dmaqueue vbiq; 581ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct em28xx_usb_isoc_ctl isoc_ctl; 582ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab spinlock_t slock; 583ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 584a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* usb transfer */ 585a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct usb_device *udev; /* the usb device */ 586a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int alt; /* alternate */ 587a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int max_pkt_size; /* max packet size of isoc transaction */ 5889d4d9c05c807ab8a49ac0024987b223bb32c022dMauro Carvalho Chehab int num_alt; /* Number of alternative settings */ 5899d4d9c05c807ab8a49ac0024987b223bb32c022dMauro Carvalho Chehab unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ 5903acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab struct urb *urb[EM28XX_NUM_BUFS]; /* urb for isoc transfers */ 591a1a6ee74f2c68918f2e145dccba3637eea91a52aNicola Soranzo char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc 592a1a6ee74f2c68918f2e145dccba3637eea91a52aNicola Soranzo transfer */ 593c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab char urb_buf[URB_MAX_CTRL_SIZE]; /* urb control msg buffer */ 594c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab 595a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* helper funcs that call usb_control_msg */ 5966ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf int (*em28xx_write_regs) (struct em28xx *dev, u16 reg, 597a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton char *buf, int len); 5986ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf int (*em28xx_read_reg) (struct em28xx *dev, u16 reg); 5996ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg, 6006ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf char *buf, int len); 6016ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg, 602a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton char *buf, int len); 6036ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg); 6043aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 6053aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab enum em28xx_mode mode; 6063aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 6076a1acc3bc5144e004996029b20e46e6020d128a7Devin Heitmueller /* register numbers for GPO/GPIO registers */ 6086a1acc3bc5144e004996029b20e46e6020d128a7Devin Heitmueller u16 reg_gpo_num, reg_gpio_num; 6096a1acc3bc5144e004996029b20e46e6020d128a7Devin Heitmueller 610c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab /* Caches GPO and GPIO registers */ 611c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab unsigned char reg_gpo, reg_gpio; 612c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab 613a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller /* Snapshot button */ 614a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller char snapshot_button_path[30]; /* path of the input dev */ 615a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller struct input_dev *sbutton_input_dev; 616a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller struct delayed_work sbutton_query_work; 617a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller 6183421b7787a2cf41ac5edce9b5766bddd1e1d9986Aidan Thornton struct em28xx_dvb *dvb; 619d2ebd0f806fdb6104903365e355675934eec22b2Mauro Carvalho Chehab 620d2ebd0f806fdb6104903365e355675934eec22b2Mauro Carvalho Chehab /* I2C keyboard data */ 621d2ebd0f806fdb6104903365e355675934eec22b2Mauro Carvalho Chehab struct IR_i2c_init_data init_data; 622a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 623a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6246d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabstruct em28xx_ops { 6256d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab struct list_head next; 6266d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab char *name; 6276d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab int id; 6286d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab int (*init)(struct em28xx *); 6296d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab int (*fini)(struct em28xx *); 630a3a048cea301baba5d451991074a85dc20a8f228Mauro Carvalho Chehab}; 631a3a048cea301baba5d451991074a85dc20a8f228Mauro Carvalho Chehab 6323acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-i2c.c */ 633fad7b958e753e18ff443786360f7846da50a3085Sascha Sommervoid em28xx_do_i2c_scan(struct em28xx *dev); 634f2cf250af156bef127433efd255abfae6aab02f6Douglas Schilling Landgrafint em28xx_i2c_register(struct em28xx *dev); 635f2cf250af156bef127433efd255abfae6aab02f6Douglas Schilling Landgrafint em28xx_i2c_unregister(struct em28xx *dev); 636a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6373acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-core.c */ 638a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6393acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabu32 em28xx_request_buffers(struct em28xx *dev, u32 count); 6403acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_queue_unusedframes(struct em28xx *dev); 6413acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_release_buffers(struct em28xx *dev); 642a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6433acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg, 644a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton char *buf, int len); 6453acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg); 6463acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg(struct em28xx *dev, u16 reg); 6473acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf, 648a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int len); 6493acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len); 650b69724899440289ab258ff417c2d6aa104c70310Devin Heitmuellerint em28xx_write_reg(struct em28xx *dev, u16 reg, u8 val); 6511bad429e81f9a9ffa01c4158e6d1b1a3e06d9886Mauro Carvalho Chehabint em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val, 6521bad429e81f9a9ffa01c4158e6d1b1a3e06d9886Mauro Carvalho Chehab u8 bitmask); 653b69724899440289ab258ff417c2d6aa104c70310Devin Heitmueller 654531c98e71805b32e9ea35a218119100bbd2b7615Mauro Carvalho Chehabint em28xx_read_ac97(struct em28xx *dev, u8 reg); 655531c98e71805b32e9ea35a218119100bbd2b7615Mauro Carvalho Chehabint em28xx_write_ac97(struct em28xx *dev, u8 reg, u16 val); 656531c98e71805b32e9ea35a218119100bbd2b7615Mauro Carvalho Chehab 6573acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_audio_analog_set(struct em28xx *dev); 65835643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehabint em28xx_audio_setup(struct em28xx *dev); 659539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab 6603acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_colorlevels_set_default(struct em28xx *dev); 6613acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_capture_start(struct em28xx *dev, int start); 662da52a55cff643b8e0b346b9894adf5b93946040dDevin Heitmuellerint em28xx_vbi_supported(struct em28xx *dev); 663bddcf63313c6a4a85f94db092f45e31f530da691Mauro Carvalho Chehabint em28xx_set_outfmt(struct em28xx *dev); 6643acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_resolution_set(struct em28xx *dev); 6653acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_set_alternate(struct em28xx *dev); 666579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonint em28xx_init_isoc(struct em28xx *dev, int max_packets, 667579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton int num_bufs, int max_pkt_size, 668c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab int (*isoc_copy) (struct em28xx *dev, struct urb *urb)); 669579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonvoid em28xx_uninit_isoc(struct em28xx *dev); 670d18e2fda7133287bf8a81809816e646cf17c332eDevin Heitmuellerint em28xx_isoc_dvb_max_packetsize(struct em28xx *dev); 671c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehabint em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode); 672c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehabint em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio); 6731a23f81b7dc3115b29cff0e4f58b5dd04a6242adMauro Carvalho Chehabvoid em28xx_wake_i2c(struct em28xx *dev); 6741a23f81b7dc3115b29cff0e4f58b5dd04a6242adMauro Carvalho Chehabvoid em28xx_remove_from_devlist(struct em28xx *dev); 6751a23f81b7dc3115b29cff0e4f58b5dd04a6242adMauro Carvalho Chehabvoid em28xx_add_into_devlist(struct em28xx *dev); 6766d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabint em28xx_register_extension(struct em28xx_ops *dev); 6776d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabvoid em28xx_unregister_extension(struct em28xx_ops *dev); 6781a23f81b7dc3115b29cff0e4f58b5dd04a6242adMauro Carvalho Chehabvoid em28xx_init_extension(struct em28xx *dev); 6791a23f81b7dc3115b29cff0e4f58b5dd04a6242adMauro Carvalho Chehabvoid em28xx_close_extension(struct em28xx *dev); 6801a23f81b7dc3115b29cff0e4f58b5dd04a6242adMauro Carvalho Chehab 6811a23f81b7dc3115b29cff0e4f58b5dd04a6242adMauro Carvalho Chehab/* Provided by em28xx-video.c */ 6821a23f81b7dc3115b29cff0e4f58b5dd04a6242adMauro Carvalho Chehabint em28xx_register_analog_devices(struct em28xx *dev); 6831a23f81b7dc3115b29cff0e4f58b5dd04a6242adMauro Carvalho Chehabvoid em28xx_release_analog_resources(struct em28xx *dev); 6846d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 6853acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-cards.c */ 6866ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafextern int em2800_variant_detect(struct usb_device *udev, int model); 687a94e95b443811c127734ef10f3b7d2220532c1d2Markus Rechbergerextern void em28xx_pre_card_setup(struct em28xx *dev); 6883acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern void em28xx_card_setup(struct em28xx *dev); 6893acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern struct em28xx_board em28xx_boards[]; 6903acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern struct usb_device_id em28xx_id_table[]; 6913acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern const unsigned int em28xx_bcount; 692c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvarevoid em28xx_register_i2c_ir(struct em28xx *dev); 693d7cba043d7ec840d67bd5143779d1febe7d83407Michael Krufkyint em28xx_tuner_callback(void *ptr, int component, int command, int arg); 6941a23f81b7dc3115b29cff0e4f58b5dd04a6242adMauro Carvalho Chehabvoid em28xx_release_resources(struct em28xx *dev); 695c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab 696c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab/* Provided by em28xx-input.c */ 697c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); 698c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); 699c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key, 700c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab u32 *ir_raw); 701ca39d84d438b609af127f2eb161cd9029afbc9a7Magnus Almint em28xx_get_key_winfast_usbii_deluxe(struct IR_i2c *ir, u32 *ir_key, 702ca39d84d438b609af127f2eb161cd9029afbc9a7Magnus Alm u32 *ir_raw); 703a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmuellervoid em28xx_register_snapshot_button(struct em28xx *dev); 704a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmuellervoid em28xx_deregister_snapshot_button(struct em28xx *dev); 705a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 706a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehabint em28xx_ir_init(struct em28xx *dev); 707a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehabint em28xx_ir_fini(struct em28xx *dev); 708a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehab 70928abf083d356bc4ec459ded7a95b6a22a20f6c3dDevin Heitmueller/* Provided by em28xx-vbi.c */ 71028abf083d356bc4ec459ded7a95b6a22a20f6c3dDevin Heitmuellerextern struct videobuf_queue_ops em28xx_vbi_qops; 71128abf083d356bc4ec459ded7a95b6a22a20f6c3dDevin Heitmueller 712a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* printk macros */ 713a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7143acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_err(fmt, arg...) do {\ 715f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare printk(KERN_ERR fmt , ##arg); } while (0) 716a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7173acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_errdev(fmt, arg...) do {\ 7184ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab printk(KERN_ERR "%s: "fmt,\ 719f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare dev->name , ##arg); } while (0) 720a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7213acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_info(fmt, arg...) do {\ 7224ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab printk(KERN_INFO "%s: "fmt,\ 723f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare dev->name , ##arg); } while (0) 7243acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_warn(fmt, arg...) do {\ 7254ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab printk(KERN_WARNING "%s: "fmt,\ 726f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare dev->name , ##arg); } while (0) 727a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7286ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_compression_disable(struct em28xx *dev) 729a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 730a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* side effect of disabling scaler and mixer */ 7312a29a0d770ef6f24a8fd7806655c826d45888cbaMauro Carvalho Chehab return em28xx_write_reg(dev, EM28XX_R26_COMPR, 0x00); 732a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 733a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7346ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_contrast_get(struct em28xx *dev) 735a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 73641facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f; 737a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 738a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7396ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_brightness_get(struct em28xx *dev) 740a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 74141facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R21_YOFFSET); 742a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 743a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7446ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_saturation_get(struct em28xx *dev) 745a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 74641facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f; 747a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 748a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7496ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_u_balance_get(struct em28xx *dev) 750a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 75141facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R23_UOFFSET); 752a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 753a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7546ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_v_balance_get(struct em28xx *dev) 755a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 75641facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R24_VOFFSET); 757a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 758a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7596ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_gamma_get(struct em28xx *dev) 760a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 76141facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f; 762a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 763a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7646ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_contrast_set(struct em28xx *dev, s32 val) 765a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 766a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 76741facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1); 768a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 769a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7706ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_brightness_set(struct em28xx *dev, s32 val) 771a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 772a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 77341facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1); 774a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 775a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7766ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_saturation_set(struct em28xx *dev, s32 val) 777a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 778a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 77941facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1); 780a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 781a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7826ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_u_balance_set(struct em28xx *dev, s32 val) 783a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 784a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 78541facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1); 786a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 787a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7886ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_v_balance_set(struct em28xx *dev, s32 val) 789a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 790a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 79141facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1); 792a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 793a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 7946ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_gamma_set(struct em28xx *dev, s32 val) 795a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 796a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 79741facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1); 798a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 799a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 800a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/*FIXME: maxw should be dependent of alt mode */ 8016ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline unsigned int norm_maxw(struct em28xx *dev) 80230556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger{ 8035569996421fa1cfc1fc0d9e683ac1def46ea985dMauro Carvalho Chehab if (dev->board.is_webcam) 8045569996421fa1cfc1fc0d9e683ac1def46ea985dMauro Carvalho Chehab return dev->sensor_xres; 8055569996421fa1cfc1fc0d9e683ac1def46ea985dMauro Carvalho Chehab 8061ca31892e3af05ad3a72769e3c922cca3cde4f9dMauro Carvalho Chehab if (dev->board.max_range_640_480 || dev->board.is_em2800) 8077d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab return 640; 8085569996421fa1cfc1fc0d9e683ac1def46ea985dMauro Carvalho Chehab 8095569996421fa1cfc1fc0d9e683ac1def46ea985dMauro Carvalho Chehab return 720; 81030556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger} 81130556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger 8126ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline unsigned int norm_maxh(struct em28xx *dev) 813a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 8145569996421fa1cfc1fc0d9e683ac1def46ea985dMauro Carvalho Chehab if (dev->board.is_webcam) 8155569996421fa1cfc1fc0d9e683ac1def46ea985dMauro Carvalho Chehab return dev->sensor_yres; 8165569996421fa1cfc1fc0d9e683ac1def46ea985dMauro Carvalho Chehab 817505b6d0b774fa4475fedbd3cebf95199c17a0086Mauro Carvalho Chehab if (dev->board.max_range_640_480) 8187d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab return 480; 8195569996421fa1cfc1fc0d9e683ac1def46ea985dMauro Carvalho Chehab 8205569996421fa1cfc1fc0d9e683ac1def46ea985dMauro Carvalho Chehab return (dev->norm & V4L2_STD_625_50) ? 576 : 480; 821a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 822a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#endif 823