em28xx.h revision b69724899440289ab258ff417c2d6aa104c70310
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> 30ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 31a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#include <linux/i2c.h> 323593cab5d62c4c7abced1076710f9bc2d8847433Ingo Molnar#include <linux/mutex.h> 33d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab#include <media/ir-kbd-i2c.h> 343aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE) 353aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#include <media/videobuf-dvb.h> 363aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#endif 373ca9c09379e8f3be0744c47f72769457fa46e9f3Mauro Carvalho Chehab#include "tuner-xc2028.h" 382ba890ec0849b222a6dabb5192ccd8fd1696d6d3Mauro Carvalho Chehab#include "em28xx-reg.h" 393aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 403aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* Boards supported by driver */ 413aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_UNKNOWN 0 423aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_UNKNOWN 1 433aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_TERRATEC_CINERGY_250 2 443aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PINNACLE_USB_2 3 453aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 4 463aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_MSI_VOX_USB_2 5 473aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_TERRATEC_CINERGY_200 6 483aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_LEADTEK_WINFAST_USBII 7 493aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_KWORLD_USB2800 8 503aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PINNACLE_DVC_90 9 513aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 10 523aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_TERRATEC_HYBRID_XS 11 533aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_KWORLD_PVRTV2800RF 12 543aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2880_BOARD_TERRATEC_PRODIGY_XS 13 553aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2820_BOARD_PROLINK_PLAYTV_USB2 14 563aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM2800_BOARD_VGEAR_POCKETTV 15 5710ac6603613d46a43a4544fbbe9581e50879bd45Mauro Carvalho Chehab#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 16 584fd305b2a2c4d16e8d4ebc95c84f946edd3385c5Devin Heitmueller#define EM2880_BOARD_PINNACLE_PCTV_HD_PRO 17 5917d9d558e818530cc7d210ffea575a36f48eaa1aDevin Heitmueller#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 18 60a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller#define EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA 19 61e14b3658a7651ffd9b1f407eaf07f4dde17ef1e7Devin Heitmueller#define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 20 6259d07f1b705c466ea4eaca9c43d46be6d6a065a4Aron Szabo#define EM2800_BOARD_GRABBEEX_USB2800 21 6395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2750_BOARD_UNKNOWN 22 6495b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2750_BOARD_DLCW_130 23 6595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_DLINK_USB_TV 24 6695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_GADMEI_UTV310 25 6795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_HERCULES_SMART_TV_USB2 26 6895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_PINNACLE_USB_2_FM1216ME 27 6995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28 7095b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_PINNACLE_DVC_100 29 7195b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2820_BOARD_VIDEOLOGY_20K14XUSB 30 7295b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2821_BOARD_USBGEAR_VD204 31 7395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2821_BOARD_SUPERCOMP_USB_2 32 7495b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2821_BOARD_PROLINK_PLAYTV_USB2 33 7595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_TERRATEC_HYBRID_XS 34 7695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_TYPHOON_DVD_MAKER 35 7795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_NETGMBH_CAM 36 7895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2860_BOARD_GADMEI_UTV330 37 7995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2861_BOARD_YAKUMO_MOVIE_MIXER 38 8095b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2861_BOARD_KWORLD_PVRTV_300U 39 8195b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2861_BOARD_PLEXTOR_PX_TV100U 40 8295b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_KWORLD_350U 41 8395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_KWORLD_355U 42 8495b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_TERRATEC_XS 43 8595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_TERRATEC_XS_MT2060 44 8695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_PINNACLE_PCTV_DVB 45 8795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2870_BOARD_COMPRO_VIDEOMATE 46 8895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_KWORLD_DVB_305U 47 8995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_KWORLD_DVB_310U 48 9095b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_MSI_DIGIVOX_AD 49 9195b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_MSI_DIGIVOX_AD_II 50 9295b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2880_BOARD_TERRATEC_HYBRID_XS_FR 51 9395b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2881_BOARD_DNT_DA2_HYBRID 52 9495b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2881_BOARD_PINNACLE_HYBRID_PRO 53 9595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2882_BOARD_KWORLD_VS_DVBT 54 9695b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2882_BOARD_TERRATEC_HYBRID_XS 55 9795b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2882_BOARD_PINNACLE_HYBRID_PRO 56 9895b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM2883_BOARD_KWORLD_HYBRID_A316 57 99ee281b856d4e4921da24387ab116bb0855c2efaaMauro Carvalho Chehab#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU 58 100864ec0b7a03c8401e6e49f9e480489478ea14cb5Devin Heitmueller#define EM2874_BOARD_PINNACLE_PCTV_80E 59 1013aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 1023aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* Limits minimum and default number of buffers */ 1033aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_MIN_BUF 4 1043aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_DEF_BUF 8 105a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 106c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab/*Limits the max URB message size */ 107c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab#define URB_MAX_CTRL_SIZE 80 108c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab 10995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf/* Params for validated field */ 11095b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM28XX_BOARD_NOT_VALIDATED 1 11195b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf#define EM28XX_BOARD_VALIDATED 0 11295b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf 113596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab/* maximum number of em28xx boards */ 1143687e1e67e4920a202d53cc24678fb34fcda8fc5Mauro Carvalho Chehab#define EM28XX_MAXBOARDS 4 /*FIXME: should be bigger */ 115596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab 116a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* maximum number of frames that can be queued */ 1173acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_FRAMES 5 118a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* number of frames that get used for v4l2_read() */ 1193acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_READ_FRAMES 2 120a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 121a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* number of buffers for isoc transfers */ 1223acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_BUFS 5 123a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 124d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab/* number of packets for each buffer 125d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab windows requests only 40 packets .. so we better do the same 126d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab this is what I found out for all alternate numbers there! 127d5e5265315770bda46c50ecaa64e2b9790f2064cMauro Carvalho Chehab */ 1283acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_NUM_PACKETS 40 129a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 130a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* default alternate; 0 means choose the best */ 1313acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_PINOUT 0 132a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 1333acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_INTERLACED_DEFAULT 1 134a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 135a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* 136a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define (use usbview if you want to get the other alternate number infos) 137a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define 138a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define alternate number 2 139a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#define Endpoint Address: 82 140a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Direction: in 141a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Attribute: 1 142a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Type: Isoc 143a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Max Packet Size: 1448 144a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Interval: 125us 145a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 146a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton alternate number 7 147a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 148a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Endpoint Address: 82 149a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Direction: in 150a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Attribute: 1 151a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Type: Isoc 152a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Max Packet Size: 3072 153a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton Interval: 125us 154a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton*/ 155a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 156a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* time to wait when stopping the isoc transfer */ 1573acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define EM28XX_URB_TIMEOUT msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS) 158a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 159596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab/* time in msecs to wait for i2c writes to finish */ 160596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab#define EM2800_I2C_WRITE_TIMEOUT 20 161596d92d5128d308b5a79f21c3e72c87f5fc7e58bMauro Carvalho Chehab 1623aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehabenum em28xx_mode { 163c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab EM28XX_MODE_UNDEFINED, 1643aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab EM28XX_ANALOG_MODE, 1653aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab EM28XX_DIGITAL_MODE, 1663aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab}; 1673aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 1683acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_stream_state { 169a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton STREAM_OFF, 170a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton STREAM_INTERRUPT, 171a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton STREAM_ON, 172a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 173a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 174579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonstruct em28xx; 175579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton 176ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_usb_isoc_ctl { 177ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* max packet size of isoc transaction */ 178ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int max_pkt_size; 179ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 180ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* number of allocated urbs */ 181ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int num_bufs; 182ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 183ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* urb for isoc transfers */ 184ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct urb **urb; 185ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 186ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* transfer buffers for isoc transfer */ 187ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab char **transfer_buffer; 188ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 189ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Last buffer command and region */ 190ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab u8 cmd; 191ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int pos, size, pktsize; 192ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 193ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Last field: ODD or EVEN? */ 194ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int field; 195ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 196ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Stores incomplete commands */ 197ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab u32 tmp_buf; 198ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int tmp_buf_len; 199ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 200ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Stores already requested buffers */ 201ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct em28xx_buffer *buf; 202ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 203ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Stores the number of received fields */ 204ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int nfields; 205579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton 206579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton /* isoc urb callback */ 207579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton int (*isoc_copy) (struct em28xx *dev, struct urb *urb); 208579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton 209ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab}; 210ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 211ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_fmt { 212ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab char *name; 213ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab u32 fourcc; /* v4l2 format id */ 214ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab}; 215ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 216ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab/* buffer for one video frame */ 217ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_buffer { 218ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* common v4l buffer stuff -- must be first */ 219ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct videobuf_buffer vb; 220ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 221a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct list_head frame; 222a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int top_field; 223ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int receiving; 224ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab}; 225ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 226ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehabstruct em28xx_dmaqueue { 227ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct list_head active; 228ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct list_head queued; 229ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 230ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab wait_queue_head_t wq; 231ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 232ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Counters to control buffer fill */ 233ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab int pos; 234a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 235a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 236a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* io methods */ 2373acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_io_method { 238a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton IO_NONE, 239a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton IO_READ, 240a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton IO_MMAP, 241a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 242a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 243a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* inputs */ 244a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 2453acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define MAX_EM28XX_INPUT 4 2463acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum enum28xx_itype { 2473acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_COMPOSITE1 = 1, 2483acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_COMPOSITE2, 2493acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_COMPOSITE3, 2503acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_COMPOSITE4, 2513acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_SVIDEO, 2523acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_TELEVISION, 2533acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_CABLE, 2543acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_DVB, 2553acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_VMUX_DEBUG, 2563acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_RADIO, 257a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 258a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 25935643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehabenum em28xx_ac97_mode { 26035643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab EM28XX_NO_AC97 = 0, 26135643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab EM28XX_AC97_EM202, 26235643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab EM28XX_AC97_OTHER, 26335643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab}; 26435643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab 26535643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehabstruct em28xx_audio_mode { 26635643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab enum em28xx_ac97_mode ac97; 26735643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab 26835643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab u16 ac97_feat; 26916c7bcadff2222b297d13951dc30e133f56d0154Mauro Carvalho Chehab u32 ac97_vendor_id; 27035643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab 27135643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab unsigned int has_audio:1; 27235643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab 27335643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab unsigned int i2s_3rates:1; 27435643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab unsigned int i2s_5rates:1; 2755c2231c84304563fd5d28e8bbb72e09e882a8e32Devin Heitmueller}; 2765c2231c84304563fd5d28e8bbb72e09e882a8e32Devin Heitmueller 2775faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab/* em28xx has two audio inputs: tuner and line in. 2785faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab However, on most devices, an auxiliary AC97 codec device is used. 2795faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab The AC97 device may have several different inputs and outputs, 2805faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab depending on their model. So, it is possible to use AC97 mixer to 2815faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab address more than two different entries. 2825faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab */ 283539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehabenum em28xx_amux { 2845faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab /* This is the only entry for em28xx tuner input */ 2855faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_VIDEO, /* em28xx tuner, AC97 mixer Video */ 2865faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab 2875faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_LINE_IN, /* AC97 mixer Line In */ 2885faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab 2895faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab /* Some less-common mixer setups */ 2905faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_VIDEO2, /* em28xx Line in, AC97 mixer Video */ 2915faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_PHONE, 2925faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_MIC, 2935faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_CD, 2945faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_AUX, 2955faff78904d9c07f38ac0e227b322e9f58d5447cMauro Carvalho Chehab EM28XX_AMUX_PCM_OUT, 296539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab}; 297539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab 2983acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_input { 2993acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab enum enum28xx_itype type; 300a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned int vmux; 301539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab enum em28xx_amux amux; 302a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 303a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 3043acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define INPUT(nr) (&em28xx_boards[dev->model].input[nr]) 305a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 3063acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_decoder { 3071ed1dd54b0456a880ab4090275a47eb5a7a245d1Devin Heitmueller EM28XX_NODECODER, 3083acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_TVP5150, 3093acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_SAA7113, 3103acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab EM28XX_SAA7114 311a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 312a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 313102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehabstruct em28xx_reg_seq { 314102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehab int reg; 315c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab unsigned char val, mask; 316102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehab int sleep; 317ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehab}; 318ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehab 3193acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_board { 320a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton char *name; 321a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int vchannels; 322a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int tuner_type; 32366767920e3e6532db8afe04f9b2d8e1a9e95cad9Mauro Carvalho Chehab int tuner_addr; 324a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 325a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* i2c flags */ 326a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned int tda9887_conf; 327a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 32874f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab unsigned int is_em2800:1; 329a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned int has_msp34xx:1; 3305add9a6f3c90680f89b4694e81025d2aed9559afMauro Carvalho Chehab unsigned int mts_firmware:1; 3313abee53e4402b6ae39e1e610f9ef94eb74097138Mauro Carvalho Chehab unsigned int has_12mhz_i2s:1; 332c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab unsigned int max_range_640_480:1; 3333aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab unsigned int has_dvb:1; 334a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller unsigned int has_snapshot_button:1; 33595b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf unsigned int valid:1; 3363abee53e4402b6ae39e1e610f9ef94eb74097138Mauro Carvalho Chehab 3373acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab enum em28xx_decoder decoder; 338a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 3393acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab struct em28xx_input input[MAX_EM28XX_INPUT]; 3400be4375410f1ecc917f3c0caf8f98908d357c93fMauro Carvalho Chehab struct em28xx_input radio; 3414b92253acc723f365ad6b2f32e4118e38133b7b8Devin Heitmueller IR_KEYTAB_TYPE *ir_codes; 342a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 343a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 3443acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx_eeprom { 345a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u32 id; /* 0x9567eb1a */ 346a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u16 vendor_ID; 347a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u16 product_ID; 348a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 349a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u16 chip_conf; 350a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 351a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u16 board_conf; 352a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 353a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u16 string1, string2, string3; 354a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 355a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 string_idx_table; 356a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 357a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 358a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* device states */ 3593acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabenum em28xx_dev_state { 360a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton DEV_INITIALIZED = 0x01, 361a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton DEV_DISCONNECTED = 0x02, 362a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton DEV_MISCONFIGURED = 0x04, 363a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 364a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 3656d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO_BUFS 5 3666d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_NUM_AUDIO_PACKETS 64 3676d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */ 3686d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_CAPTURE_STREAM_EN 1 3693aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 3703aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab/* em28xx extensions */ 3716d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab#define EM28XX_AUDIO 0x10 3723aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab#define EM28XX_DVB 0x20 3736d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 3746d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabstruct em28xx_audio { 3756d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab char name[50]; 3766d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab char *transfer_buffer[EM28XX_AUDIO_BUFS]; 3776d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab struct urb *urb[EM28XX_AUDIO_BUFS]; 3786d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab struct usb_device *udev; 3796d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab unsigned int capture_transfer_done; 3806d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab struct snd_pcm_substream *capture_pcm_substream; 3816d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 3826d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab unsigned int hwptr_done_capture; 3836d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab struct snd_card *sndcard; 3846d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 3856d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab int users, shutdown; 3866d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab enum em28xx_stream_state capture_stream; 3876d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab spinlock_t slock; 3886d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab}; 3896d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 39052284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehabstruct em28xx; 39152284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab 39252284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehabstruct em28xx_fh { 39352284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab struct em28xx *dev; 39452284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab unsigned int stream_on:1; /* Locks streams */ 39552284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab int radio; 39652284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab 39752284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab struct videobuf_queue vb_vidq; 39852284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab 39952284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab enum v4l2_buf_type type; 40052284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab}; 40152284c3e47bf502aaff72ab2ede509193b628b1bMauro Carvalho Chehab 402a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* main device struct */ 4033acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabstruct em28xx { 404a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* generic device properties */ 405a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton char name[30]; /* name (including minor) of the device */ 406a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int model; /* index in the device_data struct */ 407e5589befc472ca50882f37c4fb32333fc93a65b7Mauro Carvalho Chehab int devno; /* marks the number of this device */ 408600bd7f0edee0f9687c3c77e6fe63c74452acbfaDevin Heitmueller enum em28xx_chip_id chip_id; 40974f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab unsigned int is_em2800:1; 410a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned int has_msp34xx:1; 411a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned int has_tda9887:1; 412a225452ef80a7bd894fd2dfd01a4973d444152f4Mauro Carvalho Chehab unsigned int stream_on:1; /* Locks streams */ 413d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab unsigned int has_audio_class:1; 41424a613e4b08c4077b4c809bebab1d4a36d541fccDevin Heitmueller unsigned int has_alsa_audio:1; 4153abee53e4402b6ae39e1e610f9ef94eb74097138Mauro Carvalho Chehab unsigned int has_12mhz_i2s:1; 416c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab unsigned int max_range_640_480:1; 4173aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab unsigned int has_dvb:1; 418a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller unsigned int has_snapshot_button:1; 41995b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf unsigned int valid:1; /* report for validated boards */ 420a225452ef80a7bd894fd2dfd01a4973d444152f4Mauro Carvalho Chehab 421a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehab struct em28xx_IR *ir; 422a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehab 42389b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab /* Some older em28xx chips needs a waiting time after writing */ 42489b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab unsigned int wait_after_write; 42589b329ef9d7cc16ed46fc991b21b2d45e7bf452cMauro Carvalho Chehab 426c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab /* GPIO sequences for analog and digital mode */ 427102a0b0879a01a413ed5f667f7db9c2085ca8474Mauro Carvalho Chehab struct em28xx_reg_seq *analog_gpio, *digital_gpio; 428ee6e3a865a469c78daa93a1e6cdbaca3a102f9c8Mauro Carvalho Chehab 429c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab /* GPIO sequences for tuner callbacks */ 430c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab struct em28xx_reg_seq *tun_analog_gpio, *tun_digital_gpio; 431c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab 43274f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab int video_inputs; /* number of video inputs */ 43374f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab struct list_head devlist; 43474f38a82376fb1b289d0957429ba45349f0cad62Mauro Carvalho Chehab 4359bb13a6dc3a6f68c990264838ff0493d900c48d7Mauro Carvalho Chehab u32 i2s_speed; /* I2S speed for audio digital stream */ 4369bb13a6dc3a6f68c990264838ff0493d900c48d7Mauro Carvalho Chehab 4373acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab enum em28xx_decoder decoder; 43835643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehab struct em28xx_audio_mode audio_mode; 439a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 440a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int tuner_type; /* type of the tuner */ 441a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int tuner_addr; /* tuner address */ 442a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int tda9887_conf; 443a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* i2c i/o */ 444a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct i2c_adapter i2c_adap; 445a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct i2c_client i2c_client; 446a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* video for linux */ 447a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int users; /* user count for exclusive use */ 448a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct video_device *vdev; /* video for linux device struct */ 4497d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab v4l2_std_id norm; /* selected tv norm */ 450a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int ctl_freq; /* selected frequency */ 451a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned int ctl_input; /* selected input */ 45295b86a9a9020da22e7c25abc77aae4dc8f02ab55Douglas Schilling Landgraf unsigned int ctl_ainput;/* selected audio input */ 453a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int mute; 454a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int volume; 455a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* frame properties */ 456a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int width; /* current frame width */ 457a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int height; /* current frame height */ 458d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuil unsigned hscale; /* horizontal scale factor (see datasheet) */ 459d45b9b8ab43c8973a9630ac54f4ede6c3e009f9eHans Verkuil unsigned vscale; /* vertical scale factor (see datasheet) */ 460a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int interlaced; /* 1=interlace fileds, 0=just top fileds */ 4619e31ced888d1ca49ec5be51ef295e3ce994366c4Mauro Carvalho Chehab unsigned int video_bytesread; /* Number of bytes read */ 462a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 46303910cc39035d27f4c85c8ad2a236cc5c9456127Mauro Carvalho Chehab unsigned long hash; /* eeprom hash - for boards with generic ID */ 4646ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf unsigned long i2c_hash; /* i2c devicelist hash - 4656ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf for boards with generic ID */ 46603910cc39035d27f4c85c8ad2a236cc5c9456127Mauro Carvalho Chehab 4676d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab struct em28xx_audio *adev; 4686d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 469a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* states */ 4703acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab enum em28xx_dev_state state; 4713acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab enum em28xx_io_method io; 4729e31ced888d1ca49ec5be51ef295e3ce994366c4Mauro Carvalho Chehab 473d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab struct work_struct request_module_wk; 474d7448a8d9d06ca2ca4fd1f17404450ecba8bea3aMauro Carvalho Chehab 475a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* locks */ 4765a80415bcabf2b59e8c34db6e743c54582cfd3c2Sascha Sommer struct mutex lock; 477f2a2e4910502e866833732f31ee697d15b3e56fdMauro Carvalho Chehab struct mutex ctrl_urb_lock; /* protects urb_buf */ 478d7aa80207babe694b316a48200b096cf0336ecb3Aidan Thornton /* spinlock_t queue_lock; */ 479a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct list_head inqueue, outqueue; 480a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton wait_queue_head_t open, wait_frame, wait_stream; 481a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct video_device *vbi_dev; 4820be4375410f1ecc917f3c0caf8f98908d357c93fMauro Carvalho Chehab struct video_device *radio_dev; 483a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 484a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton unsigned char eedata[256]; 485a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 486ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab /* Isoc control struct */ 487ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct em28xx_dmaqueue vidq; 488ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab struct em28xx_usb_isoc_ctl isoc_ctl; 489ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab spinlock_t slock; 490ad0ebb96c220c461386e9a765fca3daf5590d01eMauro Carvalho Chehab 491a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* usb transfer */ 492a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton struct usb_device *udev; /* the usb device */ 493a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int alt; /* alternate */ 494a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int max_pkt_size; /* max packet size of isoc transaction */ 4959d4d9c05c807ab8a49ac0024987b223bb32c022dMauro Carvalho Chehab int num_alt; /* Number of alternative settings */ 4969d4d9c05c807ab8a49ac0024987b223bb32c022dMauro Carvalho Chehab unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ 4973acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab struct urb *urb[EM28XX_NUM_BUFS]; /* urb for isoc transfers */ 4983acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc transfer */ 499c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab char urb_buf[URB_MAX_CTRL_SIZE]; /* urb control msg buffer */ 500c4a98793a63c423c9e1af51822325969e23c16d4Mauro Carvalho Chehab 501a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* helper funcs that call usb_control_msg */ 5026ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf int (*em28xx_write_regs) (struct em28xx *dev, u16 reg, 503a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton char *buf, int len); 5046ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf int (*em28xx_read_reg) (struct em28xx *dev, u16 reg); 5056ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg, 5066ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf char *buf, int len); 5076ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg, 508a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton char *buf, int len); 5096ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgraf int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg); 5103aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 5113aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab enum em28xx_mode mode; 5123aefb79af8d41c85e11da7109d62038849421bb6Mauro Carvalho Chehab 5136a1acc3bc5144e004996029b20e46e6020d128a7Devin Heitmueller /* register numbers for GPO/GPIO registers */ 5146a1acc3bc5144e004996029b20e46e6020d128a7Devin Heitmueller u16 reg_gpo_num, reg_gpio_num; 5156a1acc3bc5144e004996029b20e46e6020d128a7Devin Heitmueller 516c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab /* Caches GPO and GPIO registers */ 517c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab unsigned char reg_gpo, reg_gpio; 518c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab 5194b92253acc723f365ad6b2f32e4118e38133b7b8Devin Heitmueller /* Infrared remote control support */ 5204b92253acc723f365ad6b2f32e4118e38133b7b8Devin Heitmueller IR_KEYTAB_TYPE *ir_codes; 5214b92253acc723f365ad6b2f32e4118e38133b7b8Devin Heitmueller 522a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller /* Snapshot button */ 523a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller char snapshot_button_path[30]; /* path of the input dev */ 524a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller struct input_dev *sbutton_input_dev; 525a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller struct delayed_work sbutton_query_work; 526a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmueller 5273421b7787a2cf41ac5edce9b5766bddd1e1d9986Aidan Thornton struct em28xx_dvb *dvb; 528a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton}; 529a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 5306d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabstruct em28xx_ops { 5316d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab struct list_head next; 5326d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab char *name; 5336d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab int id; 5346d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab int (*init)(struct em28xx *); 5356d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab int (*fini)(struct em28xx *); 536a3a048cea301baba5d451991074a85dc20a8f228Mauro Carvalho Chehab}; 537a3a048cea301baba5d451991074a85dc20a8f228Mauro Carvalho Chehab 5383acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-i2c.c */ 539a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 5403acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg); 541fad7b958e753e18ff443786360f7846da50a3085Sascha Sommervoid em28xx_do_i2c_scan(struct em28xx *dev); 5423acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_i2c_register(struct em28xx *dev); 5433acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_i2c_unregister(struct em28xx *dev); 544a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 5453acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-core.c */ 546a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 5473acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabu32 em28xx_request_buffers(struct em28xx *dev, u32 count); 5483acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_queue_unusedframes(struct em28xx *dev); 5493acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabvoid em28xx_release_buffers(struct em28xx *dev); 550a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 5513acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg, 552a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton char *buf, int len); 5533acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg); 5543acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_read_reg(struct em28xx *dev, u16 reg); 5553acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf, 556a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton int len); 5573acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len); 558b69724899440289ab258ff417c2d6aa104c70310Devin Heitmuellerint em28xx_write_reg(struct em28xx *dev, u16 reg, u8 val); 559b69724899440289ab258ff417c2d6aa104c70310Devin Heitmueller 5603acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_audio_analog_set(struct em28xx *dev); 56135643943be58aef82826e340761e86e0d37870ecMauro Carvalho Chehabint em28xx_audio_setup(struct em28xx *dev); 562539c96d0fd86bfdcfac75c88b74aa5798439293dMauro Carvalho Chehab 5633acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_colorlevels_set_default(struct em28xx *dev); 5643acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_capture_start(struct em28xx *dev, int start); 5653acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_outfmt_set_yuv422(struct em28xx *dev); 5663acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_resolution_set(struct em28xx *dev); 5673acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabint em28xx_set_alternate(struct em28xx *dev); 568579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonint em28xx_init_isoc(struct em28xx *dev, int max_packets, 569579f72e44fb1c991352f44c20b471c3001357f68Aidan Thornton int num_bufs, int max_pkt_size, 570c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehab int (*isoc_copy) (struct em28xx *dev, struct urb *urb)); 571579f72e44fb1c991352f44c20b471c3001357f68Aidan Thorntonvoid em28xx_uninit_isoc(struct em28xx *dev); 572c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehabint em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode); 573c67ec53f8f4e90ebd482789e2f6d121f41a0bd90Mauro Carvalho Chehabint em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio); 5743acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab 5756d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab/* Provided by em28xx-video.c */ 5766d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabint em28xx_register_extension(struct em28xx_ops *dev); 5776d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehabvoid em28xx_unregister_extension(struct em28xx_ops *dev); 5786d79468dd8537530f4150e76ed9b4b63f80571c6Mauro Carvalho Chehab 5793acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab/* Provided by em28xx-cards.c */ 5806ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafextern int em2800_variant_detect(struct usb_device *udev, int model); 581a94e95b443811c127734ef10f3b7d2220532c1d2Markus Rechbergerextern void em28xx_pre_card_setup(struct em28xx *dev); 5823acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern void em28xx_card_setup(struct em28xx *dev); 5833acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern struct em28xx_board em28xx_boards[]; 5843acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern struct usb_device_id em28xx_id_table[]; 5853acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehabextern const unsigned int em28xx_bcount; 586c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabvoid em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir); 587d7cba043d7ec840d67bd5143779d1febe7d83407Michael Krufkyint em28xx_tuner_callback(void *ptr, int component, int command, int arg); 588c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab 589c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab/* Provided by em28xx-input.c */ 590c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); 591c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); 592c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehabint em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key, 593c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab u32 *ir_raw); 594a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmuellervoid em28xx_register_snapshot_button(struct em28xx *dev); 595a9fc52bcbeb5245b58d23c558f3e3e8f18bebbc3Devin Heitmuellervoid em28xx_deregister_snapshot_button(struct em28xx *dev); 596a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 597a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehabint em28xx_ir_init(struct em28xx *dev); 598a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehabint em28xx_ir_fini(struct em28xx *dev); 599a924a499adb89f52046936deac87264774652a81Mauro Carvalho Chehab 600a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/* printk macros */ 601a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6023acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_err(fmt, arg...) do {\ 603f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare printk(KERN_ERR fmt , ##arg); } while (0) 604a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6053acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_errdev(fmt, arg...) do {\ 6064ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab printk(KERN_ERR "%s: "fmt,\ 607f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare dev->name , ##arg); } while (0) 608a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6093acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_info(fmt, arg...) do {\ 6104ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab printk(KERN_INFO "%s: "fmt,\ 611f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare dev->name , ##arg); } while (0) 6123acf28095009509c9ca1e283de821b5be9ddede6Mauro Carvalho Chehab#define em28xx_warn(fmt, arg...) do {\ 6134ac97914c6c35f6bf132071c718e034d0846b9f5Mauro Carvalho Chehab printk(KERN_WARNING "%s: "fmt,\ 614f85c657ff1f712abd5207a95fba8a5fcc282ab04Jean Delvare dev->name , ##arg); } while (0) 615a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6166ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_compression_disable(struct em28xx *dev) 617a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 618a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton /* side effect of disabling scaler and mixer */ 61941facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R26_COMPR, "\x00", 1); 620a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 621a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6226ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_contrast_get(struct em28xx *dev) 623a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 62441facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f; 625a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 626a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6276ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_brightness_get(struct em28xx *dev) 628a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 62941facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R21_YOFFSET); 630a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 631a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6326ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_saturation_get(struct em28xx *dev) 633a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 63441facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f; 635a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 636a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6376ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_u_balance_get(struct em28xx *dev) 638a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 63941facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R23_UOFFSET); 640a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 641a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6426ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_v_balance_get(struct em28xx *dev) 643a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 64441facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R24_VOFFSET); 645a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 646a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6476ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_gamma_get(struct em28xx *dev) 648a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 64941facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f; 650a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 651a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6526ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_contrast_set(struct em28xx *dev, s32 val) 653a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 654a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 65541facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1); 656a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 657a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6586ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_brightness_set(struct em28xx *dev, s32 val) 659a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 660a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 66141facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1); 662a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 663a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6646ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_saturation_set(struct em28xx *dev, s32 val) 665a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 666a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 66741facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1); 668a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 669a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6706ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_u_balance_set(struct em28xx *dev, s32 val) 671a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 672a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 67341facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1); 674a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 675a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6766ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_v_balance_set(struct em28xx *dev, s32 val) 677a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 678a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 67941facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1); 680a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 681a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 6826ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline int em28xx_gamma_set(struct em28xx *dev, s32 val) 683a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 684a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton u8 tmp = (u8) val; 68541facaa4b63cc1a0ff5a900149a29942d47e1491Mauro Carvalho Chehab return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1); 686a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 687a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton 688a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton/*FIXME: maxw should be dependent of alt mode */ 6896ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline unsigned int norm_maxw(struct em28xx *dev) 69030556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger{ 691c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab if (dev->max_range_640_480) 6927d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab return 640; 693c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab else 6947d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab return 720; 69530556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger} 69630556b23f31973ca311341277c4e4b128c0528bbMarkus Rechberger 6976ea54d938b6f81baa0952a8b15d3e67e6c268b8fDouglas Schilling Landgrafstatic inline unsigned int norm_maxh(struct em28xx *dev) 698a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton{ 699c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab if (dev->max_range_640_480) 7007d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab return 480; 701c8793b035df7b18997d1cf34254064dac166f009Mauro Carvalho Chehab else 7027d497f8afa80128bb99a425a6d7a766a863128a5Mauro Carvalho Chehab return (dev->norm & V4L2_STD_625_50) ? 576 : 480; 703a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton} 704a6c2ba283565dbc9f055dcb2ecba1971460bb535Andrew Morton#endif 705