blob: a551072e62ed1fb9a03293b389b8d4c6e27d9b30 [file] [log] [blame]
Mauro Carvalho Chehabf22e9e72018-03-03 10:43:14 -05001/* SPDX-License-Identifier: GPL-2.0+ */
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08002/*
Mauro Carvalho Chehabf22e9e72018-03-03 10:43:14 -05003 * em28xx.h - driver for Empia EM2800/EM2820/2840 USB video capture devices
4 *
5 * Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com>
6 * Ludovico Cavedon <cavedon@sssup.it>
Mauro Carvalho Chehab32590812018-04-25 05:34:48 -04007 * Mauro Carvalho Chehab <mchehab@kernel.org>
Mauro Carvalho Chehabf22e9e72018-03-03 10:43:14 -05008 * Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>
9 *
10 * Based on the em2800 driver from Sascha Sommer <saschasommer@freenet.de>
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080021 */
22
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080023#ifndef _EM28XX_H
24#define _EM28XX_H
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080025
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -050026#include <linux/bitfield.h>
27
Mauro Carvalho Chehab37ecc7b2016-01-27 07:07:24 -020028#define EM28XX_VERSION "0.2.2"
Mauro Carvalho Chehabd8992b02013-12-27 11:14:59 -030029#define DRIVER_DESC "Empia em28xx device driver"
Mauro Carvalho Chehabce679432013-12-22 13:13:41 -030030
Mauro Carvalho Chehab39a96b42010-10-09 15:53:58 -030031#include <linux/workqueue.h>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080032#include <linux/i2c.h>
Ingo Molnar3593cab2006-02-07 06:49:14 -020033#include <linux/mutex.h>
Mauro Carvalho Chehab47677e52014-03-05 11:21:07 -030034#include <linux/kref.h>
Mauro Carvalho Chehab39a96b42010-10-09 15:53:58 -030035#include <linux/videodev2.h>
36
Junghak Sung2d700712015-09-22 10:30:30 -030037#include <media/videobuf2-v4l2.h>
Devin Heitmuellerd3829fa2013-01-04 16:16:24 -030038#include <media/videobuf2-vmalloc.h>
Mauro Carvalho Chehab39a96b42010-10-09 15:53:58 -030039#include <media/v4l2-device.h>
Hans Verkuil081b9452012-09-07 05:43:59 -030040#include <media/v4l2-ctrls.h>
Hans Verkuil69a61642012-09-07 05:52:40 -030041#include <media/v4l2-fh.h>
Mauro Carvalho Chehabb5dcee22015-11-10 12:01:44 -020042#include <media/i2c/ir-kbd-i2c.h>
Mauro Carvalho Chehab6bda9642010-11-17 13:28:38 -030043#include <media/rc-core.h>
Mauro Carvalho Chehab3ca9c092008-04-17 21:37:53 -030044#include "tuner-xc2028.h"
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -030045#include "xc5000.h"
Mauro Carvalho Chehab2ba890e2008-04-17 21:42:58 -030046#include "em28xx-reg.h"
Mauro Carvalho Chehab3aefb792008-04-17 21:36:41 -030047
48/* Boards supported by driver */
Frank Schaeferd5b6a742013-02-11 14:01:20 -030049#define EM2800_BOARD_UNKNOWN 0
50#define EM2820_BOARD_UNKNOWN 1
51#define EM2820_BOARD_TERRATEC_CINERGY_250 2
52#define EM2820_BOARD_PINNACLE_USB_2 3
53#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 4
54#define EM2820_BOARD_MSI_VOX_USB_2 5
55#define EM2800_BOARD_TERRATEC_CINERGY_200 6
56#define EM2800_BOARD_LEADTEK_WINFAST_USBII 7
57#define EM2800_BOARD_KWORLD_USB2800 8
58#define EM2820_BOARD_PINNACLE_DVC_90 9
59#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 10
60#define EM2880_BOARD_TERRATEC_HYBRID_XS 11
61#define EM2820_BOARD_KWORLD_PVRTV2800RF 12
62#define EM2880_BOARD_TERRATEC_PRODIGY_XS 13
63#define EM2820_BOARD_PROLINK_PLAYTV_USB2 14
64#define EM2800_BOARD_VGEAR_POCKETTV 15
65#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 16
66#define EM2880_BOARD_PINNACLE_PCTV_HD_PRO 17
67#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 18
68#define EM2860_BOARD_SAA711X_REFERENCE_DESIGN 19
69#define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 20
70#define EM2800_BOARD_GRABBEEX_USB2800 21
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -030071#define EM2750_BOARD_UNKNOWN 22
72#define EM2750_BOARD_DLCW_130 23
73#define EM2820_BOARD_DLINK_USB_TV 24
74#define EM2820_BOARD_GADMEI_UTV310 25
75#define EM2820_BOARD_HERCULES_SMART_TV_USB2 26
76#define EM2820_BOARD_PINNACLE_USB_2_FM1216ME 27
77#define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28
Devin Heitmueller443fed92010-03-19 23:53:12 -030078#define EM2860_BOARD_TVP5150_REFERENCE_DESIGN 29
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -030079#define EM2820_BOARD_VIDEOLOGY_20K14XUSB 30
80#define EM2821_BOARD_USBGEAR_VD204 31
81#define EM2821_BOARD_SUPERCOMP_USB_2 32
Adrian Taylor8298f2f2010-10-20 07:55:33 -030082#define EM2860_BOARD_ELGATO_VIDEO_CAPTURE 33
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -030083#define EM2860_BOARD_TERRATEC_HYBRID_XS 34
84#define EM2860_BOARD_TYPHOON_DVD_MAKER 35
85#define EM2860_BOARD_NETGMBH_CAM 36
86#define EM2860_BOARD_GADMEI_UTV330 37
87#define EM2861_BOARD_YAKUMO_MOVIE_MIXER 38
88#define EM2861_BOARD_KWORLD_PVRTV_300U 39
89#define EM2861_BOARD_PLEXTOR_PX_TV100U 40
90#define EM2870_BOARD_KWORLD_350U 41
91#define EM2870_BOARD_KWORLD_355U 42
92#define EM2870_BOARD_TERRATEC_XS 43
93#define EM2870_BOARD_TERRATEC_XS_MT2060 44
94#define EM2870_BOARD_PINNACLE_PCTV_DVB 45
95#define EM2870_BOARD_COMPRO_VIDEOMATE 46
96#define EM2880_BOARD_KWORLD_DVB_305U 47
97#define EM2880_BOARD_KWORLD_DVB_310U 48
98#define EM2880_BOARD_MSI_DIGIVOX_AD 49
99#define EM2880_BOARD_MSI_DIGIVOX_AD_II 50
100#define EM2880_BOARD_TERRATEC_HYBRID_XS_FR 51
101#define EM2881_BOARD_DNT_DA2_HYBRID 52
102#define EM2881_BOARD_PINNACLE_HYBRID_PRO 53
103#define EM2882_BOARD_KWORLD_VS_DVBT 54
104#define EM2882_BOARD_TERRATEC_HYBRID_XS 55
Devin Heitmueller09bc1942011-03-13 02:07:54 -0300105#define EM2882_BOARD_PINNACLE_HYBRID_PRO_330E 56
Frank Schaeferd5b6a742013-02-11 14:01:20 -0300106#define EM2883_BOARD_KWORLD_HYBRID_330U 57
Mauro Carvalho Chehabee281b82008-07-27 16:58:04 -0300107#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU 58
Devin Heitmueller38b2df92012-08-13 21:18:02 -0300108#define EM2874_BOARD_PCTV_HD_MINI_80E 59
Douglas Schilling Landgraff89bc322008-12-01 21:01:04 -0300109#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 60
Douglas Schilling Landgraf1e1addd2008-12-27 21:38:14 -0300110#define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2 61
Douglas Schilling Landgraff7fe3e62009-01-19 09:31:55 -0300111#define EM2820_BOARD_GADMEI_TVR200 62
Frank Schaeferd5b6a742013-02-11 14:01:20 -0300112#define EM2860_BOARD_KAIOMY_TVNPC_U2 63
113#define EM2860_BOARD_EASYCAP 64
Indika Katugampalaf74a61e32009-02-11 11:13:05 -0300114#define EM2820_BOARD_IODATA_GVMVP_SZ 65
Douglas Schilling Landgrafe5db5d42009-04-09 18:24:34 -0300115#define EM2880_BOARD_EMPIRE_DUAL_TV 66
Mauro Carvalho Chehab4557af92009-05-23 09:58:52 -0300116#define EM2860_BOARD_TERRATEC_GRABBY 67
Mauro Carvalho Chehab766ed642009-05-24 00:46:01 -0300117#define EM2860_BOARD_TERRATEC_AV350 68
Franklin Mengd7de5d82009-06-06 17:05:02 -0300118#define EM2882_BOARD_KWORLD_ATSC_315U 69
Devin Heitmueller19859222009-06-19 00:33:54 -0300119#define EM2882_BOARD_EVGA_INDTUBE 70
Frank Schaeferd5b6a742013-02-11 14:01:20 -0300120#define EM2820_BOARD_SILVERCREST_WEBCAM 71
121#define EM2861_BOARD_GADMEI_UTV330PLUS 72
122#define EM2870_BOARD_REDDO_DVB_C_USB_BOX 73
Mauro Carvalho Chehab694a1012009-11-26 21:26:13 -0300123#define EM2800_BOARD_VC211A 74
Andrea.Amorosi76@gmail.com7ca7ef62010-02-09 17:53:38 -0300124#define EM2882_BOARD_DIKOM_DK300 75
Jarod Wilson7e48b302010-03-07 17:55:43 -0300125#define EM2870_BOARD_KWORLD_A340 76
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -0300126#define EM2874_BOARD_LEADERSHIP_ISDBT 77
Frank Schaeferd5b6a742013-02-11 14:01:20 -0300127#define EM28174_BOARD_PCTV_290E 78
Mauro Carvalho Chehabfec528b2011-07-03 21:05:06 -0300128#define EM2884_BOARD_TERRATEC_H5 79
Frank Schaeferd5b6a742013-02-11 14:01:20 -0300129#define EM28174_BOARD_PCTV_460E 80
Eddi De Pieri82e7dbb2011-11-19 11:37:14 -0300130#define EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C 81
Andreas Oberrittera1ed02e2011-11-16 11:06:50 -0300131#define EM2884_BOARD_CINERGY_HTC_STICK 82
Frank Schaeferd5b6a742013-02-11 14:01:20 -0300132#define EM2860_BOARD_HT_VIDBOX_NW03 83
133#define EM2874_BOARD_MAXMEDIA_UB425_TC 84
134#define EM2884_BOARD_PCTV_510E 85
135#define EM2884_BOARD_PCTV_520E 86
Martin Blumenstingl89040132012-10-04 14:22:54 -0300136#define EM2884_BOARD_TERRATEC_HTC_USB_XS 87
Mauro Carvalho Chehab4159d012013-02-28 10:35:56 -0300137#define EM2884_BOARD_C3TECH_DIGITAL_DUO 88
Jakob Haufe7c1dfdb2013-04-13 11:03:37 -0300138#define EM2874_BOARD_DELOCK_61959 89
Jean-Francois Thibert6dbea9f2013-10-09 11:18:05 -0300139#define EM2874_BOARD_KWORLD_UB435Q_V2 90
Frank Schaefer0c37e732013-12-01 18:06:57 -0300140#define EM2765_BOARD_SPEEDLINK_VAD_LAPLACE 91
Antti Palosaariec573362013-02-25 09:01:13 -0300141#define EM28178_BOARD_PCTV_461E 92
Mauro Carvalho Chehab02bc1f52014-03-03 16:28:39 -0300142#define EM2874_BOARD_KWORLD_UB435Q_V3 93
Antti Palosaari19229242014-04-10 22:11:27 -0300143#define EM28178_BOARD_PCTV_292E 94
Witold Krecickieace9722014-10-19 19:25:59 -0300144#define EM2861_BOARD_LEADTEK_VC100 95
Olli Salonenfc30dd762014-11-24 03:57:34 -0300145#define EM28178_BOARD_TERRATEC_T2_STICK_HD 96
Gilles Risch1fe0fbd2015-03-01 17:11:05 -0300146#define EM2884_BOARD_ELGATO_EYETV_HYBRID_2008 97
Satoshi Nagahamaab4d1452016-05-06 16:35:05 -0300147#define EM28178_BOARD_PLEX_PX_BCUD 98
Olli Salonen11a2a942016-04-04 12:12:52 -0300148#define EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB 99
Kevin Cheng15863422017-01-10 01:14:29 -0200149#define EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 100
Mauro Carvalho Chehabd6a64322017-05-02 23:12:23 -0300150#define EM2884_BOARD_TERRATEC_H6 101
Marcel Storkacf43842018-04-26 15:17:02 -0400151#define EM2882_BOARD_ZOLID_HYBRID_TV_STICK 102
Mauro Carvalho Chehab3aefb792008-04-17 21:36:41 -0300152
153/* Limits minimum and default number of buffers */
154#define EM28XX_MIN_BUF 4
155#define EM28XX_DEF_BUF 8
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800156
Mauro Carvalho Chehabc4a98792008-11-18 14:51:08 -0300157/*Limits the max URB message size */
158#define URB_MAX_CTRL_SIZE 80
159
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300160/* Params for validated field */
161#define EM28XX_BOARD_NOT_VALIDATED 1
162#define EM28XX_BOARD_VALIDATED 0
163
Douglas Schilling Landgraf22cff7b2009-02-08 01:38:10 -0300164/* Params for em28xx_cmd() audio */
165#define EM28XX_START_AUDIO 1
166#define EM28XX_STOP_AUDIO 0
167
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800168/* maximum number of em28xx boards */
Brad Love48efbc32018-01-04 19:04:14 -0500169#define EM28XX_MAXBOARDS DVB_MAX_ADAPTERS /* All adapters could be em28xx */
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800170
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800171/* maximum number of frames that can be queued */
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800172#define EM28XX_NUM_FRAMES 5
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800173/* number of frames that get used for v4l2_read() */
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800174#define EM28XX_NUM_READ_FRAMES 2
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800175
176/* number of buffers for isoc transfers */
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800177#define EM28XX_NUM_BUFS 5
Gianluca Gennari86d38d12012-02-13 13:59:22 -0300178#define EM28XX_DVB_NUM_BUFS 5
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800179
Mauro Carvalho Chehabc7a45e52013-03-05 06:55:26 -0300180/* max number of I2C buses on em28xx devices */
181#define NUM_I2C_BUSES 2
182
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500183/*
184 * isoc transfers: number of packets for each buffer
185 * windows requests only 64 packets .. so we better do the same
186 * this is what I found out for all alternate numbers there!
Mauro Carvalho Chehabd5e52652005-11-08 21:37:32 -0800187 */
Frank Schaefer515688a2012-11-08 14:11:35 -0300188#define EM28XX_NUM_ISOC_PACKETS 64
189#define EM28XX_DVB_NUM_ISOC_PACKETS 64
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800190
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500191/*
192 * bulk transfers: transfer buffer size = packet size * packet multiplier
193 * USB 2.0 spec says bulk packet size is always 512 bytes
Frank Schaeferc647a912012-11-08 14:11:52 -0300194 */
195#define EM28XX_BULK_PACKET_MULTIPLIER 384
Brad Lovec7c7e8d2018-01-04 19:04:13 -0500196#define EM28XX_DVB_BULK_PACKET_MULTIPLIER 94
Frank Schaeferc647a912012-11-08 14:11:52 -0300197
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800198#define EM28XX_INTERLACED_DEFAULT 1
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800199
Mauro Carvalho Chehab5022a202013-12-27 00:28:57 -0300200/* time in msecs to wait for AC97 xfers to finish */
201#define EM28XX_AC97_XFER_TIMEOUT 100
202
Frank Schaeferf52226092013-12-01 18:06:52 -0300203/* max. number of button state polling addresses */
204#define EM28XX_NUM_BUTTON_ADDRESSES_MAX 5
205
Brad Lovebe7fd3c2018-01-04 19:04:11 -0500206#define PRIMARY_TS 0
207#define SECONDARY_TS 1
208
Mauro Carvalho Chehab3aefb792008-04-17 21:36:41 -0300209enum em28xx_mode {
Mauro Carvalho Chehab2fe3e2e2008-11-27 09:10:40 -0300210 EM28XX_SUSPEND,
Mauro Carvalho Chehab3aefb792008-04-17 21:36:41 -0300211 EM28XX_ANALOG_MODE,
212 EM28XX_DIGITAL_MODE,
213};
214
Aidan Thornton579f72e2008-04-17 21:40:16 -0300215struct em28xx;
216
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500217/**
218 * struct em28xx_usb_bufs - Contains URB-related buffer data
219 *
220 * @max_pkt_size: max packet size of isoc transaction
221 * @num_packets: number of packets in each buffer
222 * @num_bufs: number of allocated urb
223 * @urb: urb for isoc/bulk transfers
224 * @buf: transfer buffers for isoc/bulk transfer
225 */
Frank Schaeferf0fa9932012-11-08 14:11:36 -0300226struct em28xx_usb_bufs {
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300227 int max_pkt_size;
Gianluca Gennari86d38d12012-02-13 13:59:22 -0300228 int num_packets;
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300229 int num_bufs;
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300230 struct urb **urb;
Mauro Carvalho Chehabd571b592018-02-27 06:08:09 -0500231 char **buf;
Gianluca Gennari86d38d12012-02-13 13:59:22 -0300232};
233
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500234/**
235 * struct em28xx_usb_ctl - Contains URB-related buffer data
236 *
237 * @analog_bufs: isoc/bulk transfer buffers for analog mode
238 * @digital_bufs: isoc/bulk transfer buffers for digital mode
239 * @vid_buf: Stores already requested video buffers
240 * @vbi_buf: Stores already requested VBI buffers
241 * @urb_data_copy: copy data from URB
242 */
Frank Schaefer74209dc2012-11-08 14:11:37 -0300243struct em28xx_usb_ctl {
Frank Schaeferf0fa9932012-11-08 14:11:36 -0300244 struct em28xx_usb_bufs analog_bufs;
Frank Schaeferf0fa9932012-11-08 14:11:36 -0300245 struct em28xx_usb_bufs digital_bufs;
Mauro Carvalho Chehabfdf1bc92014-11-28 08:34:15 -0300246 struct em28xx_buffer *vid_buf;
247 struct em28xx_buffer *vbi_buf;
Mauro Carvalho Chehabfdf1bc92014-11-28 08:34:15 -0300248 int (*urb_data_copy)(struct em28xx *dev, struct urb *urb);
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300249};
250
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500251/**
252 * struct em28xx_fmt - Struct to enumberate video formats
253 *
254 * @name: Name for the video standard
255 * @fourcc: v4l2 format id
256 * @depth: mean number of bits to represent a pixel
257 * @reg: em28xx register value to set it
258 */
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300259struct em28xx_fmt {
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500260 char *name;
261 u32 fourcc;
262 int depth;
263 int reg;
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300264};
265
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500266/**
267 * struct em28xx_buffer- buffer for storing one video frame
268 *
269 * @vb: common v4l buffer stuff
270 * @list: List to associate it with the other buffers
271 * @mem: pointer to the buffer, as returned by vb2_plane_vaddr()
272 * @length: length of the buffer, as returned by vb2_plane_size()
273 * @top_field: If non-zero, indicate that the buffer is the top field
274 * @pos: Indicate the next position of the buffer to be filled.
275 * @vb_buf: pointer to vmalloc memory address in vb
276 *
277 * .. note::
278 *
279 * in interlaced mode, @pos is reset to zero at the start of each new
280 * field (not frame !)
281 */
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300282struct em28xx_buffer {
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500283 struct vb2_v4l2_buffer vb; /* must be first */
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300284
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500285 struct list_head list;
Frank Schaefer87325332012-12-08 11:31:27 -0300286
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500287 void *mem;
288 unsigned int length;
289 int top_field;
Frank Schaefer4078d622012-12-08 11:31:29 -0300290
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500291 unsigned int pos;
292
293 char *vb_buf;
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300294};
295
296struct em28xx_dmaqueue {
297 struct list_head active;
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300298
299 wait_queue_head_t wq;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800300};
301
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800302/* inputs */
303
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800304#define MAX_EM28XX_INPUT 4
305enum enum28xx_itype {
Mauro Carvalho Chehabd83a96a2016-01-27 09:24:29 -0200306 EM28XX_VMUX_COMPOSITE = 1,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800307 EM28XX_VMUX_SVIDEO,
308 EM28XX_VMUX_TELEVISION,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800309 EM28XX_RADIO,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800310};
311
Mauro Carvalho Chehab35643942008-11-19 12:01:33 -0300312enum em28xx_ac97_mode {
313 EM28XX_NO_AC97 = 0,
314 EM28XX_AC97_EM202,
Mauro Carvalho Chehab209acc02008-11-20 12:49:33 -0300315 EM28XX_AC97_SIGMATEL,
Mauro Carvalho Chehab35643942008-11-19 12:01:33 -0300316 EM28XX_AC97_OTHER,
317};
318
319struct em28xx_audio_mode {
320 enum em28xx_ac97_mode ac97;
Frank Schaefer920f1e42014-09-13 05:52:21 -0300321};
Mauro Carvalho Chehab35643942008-11-19 12:01:33 -0300322
Frank Schaefer920f1e42014-09-13 05:52:21 -0300323enum em28xx_int_audio_type {
324 EM28XX_INT_AUDIO_NONE = 0,
325 EM28XX_INT_AUDIO_AC97,
326 EM28XX_INT_AUDIO_I2S,
Devin Heitmueller5c2231c2008-11-19 08:22:28 -0300327};
Devin Heitmueller5c2231c2008-11-19 08:22:28 -0300328
Frank Schaeferc5874202014-09-13 05:52:20 -0300329enum em28xx_usb_audio_type {
330 EM28XX_USB_AUDIO_NONE = 0,
331 EM28XX_USB_AUDIO_CLASS,
332 EM28XX_USB_AUDIO_VENDOR,
Devin Heitmueller5c2231c2008-11-19 08:22:28 -0300333};
334
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500335/**
336 * em28xx_amux - describes the type of audio input used by em28xx
337 *
Mauro Carvalho Chehab258c4302018-09-14 13:13:15 -0400338 * @EM28XX_AMUX_UNUSED:
339 * Used only on em28xx dev->map field, in order to mark an entry
340 * as unused.
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500341 * @EM28XX_AMUX_VIDEO:
342 * On devices without AC97, this is the only value that it is currently
343 * allowed.
344 * On devices with AC97, it corresponds to the AC97 mixer "Video" control.
345 * @EM28XX_AMUX_LINE_IN:
346 * Only for devices with AC97. Corresponds to AC97 mixer "Line In".
347 * @EM28XX_AMUX_VIDEO2:
348 * Only for devices with AC97. It means that em28xx should use "Line In"
349 * And AC97 should use the "Video" mixer control.
350 * @EM28XX_AMUX_PHONE:
351 * Only for devices with AC97. Corresponds to AC97 mixer "Phone".
352 * @EM28XX_AMUX_MIC:
353 * Only for devices with AC97. Corresponds to AC97 mixer "Mic".
354 * @EM28XX_AMUX_CD:
355 * Only for devices with AC97. Corresponds to AC97 mixer "CD".
356 * @EM28XX_AMUX_AUX:
357 * Only for devices with AC97. Corresponds to AC97 mixer "Aux".
358 * @EM28XX_AMUX_PCM_OUT:
359 * Only for devices with AC97. Corresponds to AC97 mixer "PCM out".
360 *
361 * The em28xx chip itself has only two audio inputs: tuner and line in.
362 * On almost all devices, only the tuner input is used.
363 *
364 * However, on most devices, an auxiliary AC97 codec device is used,
365 * usually connected to the em28xx tuner input (except for
366 * @EM28XX_AMUX_LINE_IN).
367 *
368 * The AC97 device typically have several different inputs and outputs.
369 * The exact number and description depends on their model.
370 *
371 * It is possible to AC97 to mixer more than one different entries at the
372 * same time, via the alsa mux.
Mauro Carvalho Chehab5faff782008-11-20 09:06:09 -0300373 */
Mauro Carvalho Chehab539c96d2008-01-05 09:53:54 -0300374enum em28xx_amux {
Mauro Carvalho Chehab258c4302018-09-14 13:13:15 -0400375 EM28XX_AMUX_UNUSED = -1,
376 EM28XX_AMUX_VIDEO = 0,
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500377 EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab5faff782008-11-20 09:06:09 -0300378
379 /* Some less-common mixer setups */
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500380 EM28XX_AMUX_VIDEO2,
Mauro Carvalho Chehab5faff782008-11-20 09:06:09 -0300381 EM28XX_AMUX_PHONE,
382 EM28XX_AMUX_MIC,
383 EM28XX_AMUX_CD,
384 EM28XX_AMUX_AUX,
385 EM28XX_AMUX_PCM_OUT,
Mauro Carvalho Chehab539c96d2008-01-05 09:53:54 -0300386};
387
Mauro Carvalho Chehab35ae6f02008-11-20 12:40:51 -0300388enum em28xx_aout {
Mauro Carvalho Chehab8866f9c2009-01-12 21:50:52 -0300389 /* AC97 outputs */
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500390 EM28XX_AOUT_MASTER = BIT(0),
391 EM28XX_AOUT_LINE = BIT(1),
392 EM28XX_AOUT_MONO = BIT(2),
393 EM28XX_AOUT_LFE = BIT(3),
394 EM28XX_AOUT_SURR = BIT(4),
Mauro Carvalho Chehab8866f9c2009-01-12 21:50:52 -0300395
396 /* PCM IN Mixer - used by AC97_RECORD_SELECT register */
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500397 EM28XX_AOUT_PCM_IN = BIT(7),
Mauro Carvalho Chehab8866f9c2009-01-12 21:50:52 -0300398
399 /* Bits 10-8 are used to indicate the PCM IN record select */
400 EM28XX_AOUT_PCM_MIC_PCM = 0 << 8,
401 EM28XX_AOUT_PCM_CD = 1 << 8,
402 EM28XX_AOUT_PCM_VIDEO = 2 << 8,
403 EM28XX_AOUT_PCM_AUX = 3 << 8,
404 EM28XX_AOUT_PCM_LINE = 4 << 8,
405 EM28XX_AOUT_PCM_STEREO = 5 << 8,
406 EM28XX_AOUT_PCM_MONO = 6 << 8,
407 EM28XX_AOUT_PCM_PHONE = 7 << 8,
Mauro Carvalho Chehab35ae6f02008-11-20 12:40:51 -0300408};
409
Hans Verkuil32929fb2009-01-17 11:21:02 -0300410static inline int ac97_return_record_select(int a_out)
Mauro Carvalho Chehab8866f9c2009-01-12 21:50:52 -0300411{
412 return (a_out & 0x700) >> 8;
413}
414
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300415struct em28xx_reg_seq {
416 int reg;
417 unsigned char val, mask;
418 int sleep;
419};
420
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800421struct em28xx_input {
422 enum enum28xx_itype type;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800423 unsigned int vmux;
Mauro Carvalho Chehab539c96d2008-01-05 09:53:54 -0300424 enum em28xx_amux amux;
Mauro Carvalho Chehab35ae6f02008-11-20 12:40:51 -0300425 enum em28xx_aout aout;
Mauro Carvalho Chehab0108ae72018-03-01 10:34:34 -0500426 const struct em28xx_reg_seq *gpio;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800427};
428
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800429#define INPUT(nr) (&em28xx_boards[dev->model].input[nr])
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800430
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800431enum em28xx_decoder {
Mauro Carvalho Chehab527f09a2009-07-12 11:04:15 -0300432 EM28XX_NODECODER = 0,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800433 EM28XX_TVP5150,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300434 EM28XX_SAA711X,
Mauro Carvalho Chehab527f09a2009-07-12 11:04:15 -0300435};
436
437enum em28xx_sensor {
438 EM28XX_NOSENSOR = 0,
Mauro Carvalho Chehab02e78042009-06-29 11:35:05 -0300439 EM28XX_MT9V011,
Mauro Carvalho Chehabb80fd2d2009-07-14 21:08:22 -0300440 EM28XX_MT9M001,
Mauro Carvalho Chehabf2e26ae2009-08-12 20:21:44 -0300441 EM28XX_MT9M111,
Frank Schaefere4b71312013-03-27 17:06:36 -0300442 EM28XX_OV2640,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800443};
444
Mauro Carvalho Chehabdf7fa092009-02-25 09:06:13 -0300445enum em28xx_adecoder {
446 EM28XX_NOADECODER = 0,
447 EM28XX_TVAUDIO,
448};
449
Frank Schaefer6b8a3172013-12-01 18:06:55 -0300450enum em28xx_led_role {
451 EM28XX_LED_ANALOG_CAPTURING = 0,
Mauro Carvalho Chehab54e92542014-03-04 12:33:45 -0300452 EM28XX_LED_DIGITAL_CAPTURING,
Olli Salonen11a2a942016-04-04 12:12:52 -0300453 EM28XX_LED_DIGITAL_CAPTURING_TS2,
Frank Schaefer6063d072013-12-01 18:06:56 -0300454 EM28XX_LED_ILLUMINATION,
Frank Schaefer6b8a3172013-12-01 18:06:55 -0300455 EM28XX_NUM_LED_ROLES, /* must be the last */
456};
457
Frank Schaefer07e4de32013-12-01 18:06:51 -0300458struct em28xx_led {
Frank Schaefer6b8a3172013-12-01 18:06:55 -0300459 enum em28xx_led_role role;
Frank Schaefer07e4de32013-12-01 18:06:51 -0300460 u8 gpio_reg;
461 u8 gpio_mask;
462 bool inverted;
463};
464
Frank Schaeferf52226092013-12-01 18:06:52 -0300465enum em28xx_button_role {
466 EM28XX_BUTTON_SNAPSHOT = 0,
Frank Schaefer6063d072013-12-01 18:06:56 -0300467 EM28XX_BUTTON_ILLUMINATION,
Frank Schaeferf52226092013-12-01 18:06:52 -0300468 EM28XX_NUM_BUTTON_ROLES, /* must be the last */
469};
470
471struct em28xx_button {
472 enum em28xx_button_role role;
473 u8 reg_r;
474 u8 reg_clearing;
475 u8 mask;
476 bool inverted;
477};
478
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800479struct em28xx_board {
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800480 char *name;
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -0300481 int vchannels;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800482 int tuner_type;
Mauro Carvalho Chehab66767922008-11-16 08:05:06 -0300483 int tuner_addr;
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500484 unsigned int def_i2c_bus; /* Default I2C bus */
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800485
486 /* i2c flags */
487 unsigned int tda9887_conf;
488
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300489 /* GPIO sequences */
Mauro Carvalho Chehab0108ae72018-03-01 10:34:34 -0500490 const struct em28xx_reg_seq *dvb_gpio;
491 const struct em28xx_reg_seq *suspend_gpio;
492 const struct em28xx_reg_seq *tuner_gpio;
493 const struct em28xx_reg_seq *mute_gpio;
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300494
Mauro Carvalho Chehab74f38a82008-01-05 09:54:58 -0300495 unsigned int is_em2800:1;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800496 unsigned int has_msp34xx:1;
Mauro Carvalho Chehab5add9a62007-11-22 12:08:53 -0300497 unsigned int mts_firmware:1;
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -0300498 unsigned int max_range_640_480:1;
Mauro Carvalho Chehab3aefb792008-04-17 21:36:41 -0300499 unsigned int has_dvb:1;
Brad Lovebe7fd3c2018-01-04 19:04:11 -0500500 unsigned int has_dual_ts:1;
Mauro Carvalho Chehabc43221d2009-07-12 10:23:23 -0300501 unsigned int is_webcam:1;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300502 unsigned int valid:1;
Mauro Carvalho Chehabac07bb72009-09-08 14:04:41 -0300503 unsigned int has_ir_i2c:1;
Mauro Carvalho Chehab3abee532008-01-05 17:01:41 -0300504
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -0300505 unsigned char xclk, i2c_speed;
Douglas Schilling Landgraff2cf2502009-03-31 17:10:58 -0300506 unsigned char radio_addr;
507 unsigned short tvaudio_addr;
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -0300508
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800509 enum em28xx_decoder decoder;
Mauro Carvalho Chehabdf7fa092009-02-25 09:06:13 -0300510 enum em28xx_adecoder adecoder;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800511
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800512 struct em28xx_input input[MAX_EM28XX_INPUT];
Mauro Carvalho Chehab0be43752008-01-05 17:22:01 -0300513 struct em28xx_input radio;
Mauro Carvalho Chehab02858ee2010-04-02 20:01:00 -0300514 char *ir_codes;
Frank Schaefer07e4de32013-12-01 18:06:51 -0300515
516 /* LEDs that need to be controlled explicitly */
Frank Schaefer6b8a3172013-12-01 18:06:55 -0300517 struct em28xx_led *leds;
Frank Schaeferf52226092013-12-01 18:06:52 -0300518
519 /* Buttons */
Mauro Carvalho Chehab0108ae72018-03-01 10:34:34 -0500520 const struct em28xx_button *buttons;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800521};
522
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800523struct em28xx_eeprom {
Frank Schaefer0c28dcc2013-03-03 15:37:38 -0300524 u8 id[4]; /* 1a eb 67 95 */
525 __le16 vendor_ID;
526 __le16 product_ID;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800527
Frank Schaefer0c28dcc2013-03-03 15:37:38 -0300528 __le16 chip_conf;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800529
Frank Schaefer0c28dcc2013-03-03 15:37:38 -0300530 __le16 board_conf;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800531
Frank Schaefer0c28dcc2013-03-03 15:37:38 -0300532 __le16 string1, string2, string3;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800533
534 u8 string_idx_table;
535};
536
Mauro Carvalho Chehab6d794682008-01-05 09:57:31 -0300537#define EM28XX_CAPTURE_STREAM_EN 1
Mauro Carvalho Chehab3aefb792008-04-17 21:36:41 -0300538
539/* em28xx extensions */
Mauro Carvalho Chehab6d794682008-01-05 09:57:31 -0300540#define EM28XX_AUDIO 0x10
Mauro Carvalho Chehab3aefb792008-04-17 21:36:41 -0300541#define EM28XX_DVB 0x20
Ezequiel Garcíaf4d4e762012-03-26 09:13:35 -0300542#define EM28XX_RC 0x30
Mauro Carvalho Chehab01c28192013-12-22 13:27:02 -0300543#define EM28XX_V4L2 0x40
Mauro Carvalho Chehab6d794682008-01-05 09:57:31 -0300544
Devin Heitmueller8c873d32009-09-03 00:23:27 -0300545/* em28xx resource types (used for res_get/res_lock etc */
546#define EM28XX_RESOURCE_VIDEO 0x01
547#define EM28XX_RESOURCE_VBI 0x02
548
Frank Schaefer95d26082014-03-24 16:33:09 -0300549struct em28xx_v4l2 {
550 struct kref ref;
Frank Schaeferabc13082014-03-24 16:33:10 -0300551 struct em28xx *dev;
Frank Schaefer95d26082014-03-24 16:33:09 -0300552
553 struct v4l2_device v4l2_dev;
Frank Schaeferabc13082014-03-24 16:33:10 -0300554 struct v4l2_ctrl_handler ctrl_handler;
Frank Schaeferef74a0b2014-03-24 16:33:12 -0300555
Hans Verkuild4352f32015-03-09 13:34:06 -0300556 struct video_device vdev;
557 struct video_device vbi_dev;
558 struct video_device radio_dev;
Frank Schaefer27a36df2014-03-24 16:33:13 -0300559
560 /* Videobuf2 */
561 struct vb2_queue vb_vidq;
562 struct vb2_queue vb_vbiq;
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500563 struct mutex vb_queue_lock; /* Protects vb_vidq */
564 struct mutex vb_vbi_queue_lock; /* Protects vb_vbiq */
Frank Schaefer753aee72014-03-24 16:33:14 -0300565
Frank Schaefer92972852014-03-24 16:33:15 -0300566 u8 vinmode;
567 u8 vinctl;
568
Frank Schaeferd7dc18d2014-03-24 16:33:19 -0300569 /* Camera specific fields */
570 int sensor_xres;
571 int sensor_yres;
572 int sensor_xtal;
573
Frank Schaefer8e2c8712014-09-18 17:55:45 -0300574 int users; /* user count for exclusive use */
Frank Schaefer8139a4d2014-05-11 17:59:04 -0300575 int streaming_users; /* number of actively streaming users */
576
Frank Schaefer3854b0d2014-03-24 16:33:22 -0300577 u32 frequency; /* selected tuner frequency */
578
Frank Schaefer06e20672014-03-24 16:33:17 -0300579 struct em28xx_fmt *format;
Frank Schaefer52faaf72014-03-24 16:33:16 -0300580 v4l2_std_id norm; /* selected tv norm */
581
Frank Schaefer58159172014-03-24 16:33:18 -0300582 /* Progressive/interlaced mode */
583 bool progressive;
584 int interlaced_fieldmode; /* 1=interlaced fields, 0=just top fields */
585 /* FIXME: everything else than interlaced_fieldmode=1 doesn't work */
586
Frank Schaefer753aee72014-03-24 16:33:14 -0300587 /* Frame properties */
588 int width; /* current frame width */
589 int height; /* current frame height */
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500590 unsigned int hscale; /* horizontal scale factor (see datasheet) */
591 unsigned int vscale; /* vertical scale factor (see datasheet) */
Frank Schaefer753aee72014-03-24 16:33:14 -0300592 unsigned int vbi_width;
593 unsigned int vbi_height; /* lines per field */
Frank Schaeferf0e38232014-03-24 16:33:20 -0300594
595 /* Capture state tracking */
596 int capture_type;
597 bool top_field;
598 int vbi_read;
599 unsigned int field_count;
Mauro Carvalho Chehab37ecc7b2016-01-27 07:07:24 -0200600
601#ifdef CONFIG_MEDIA_CONTROLLER
602 struct media_pad video_pad, vbi_pad;
603 struct media_entity *decoder;
604#endif
Frank Schaefer95d26082014-03-24 16:33:09 -0300605};
606
Mauro Carvalho Chehab6d794682008-01-05 09:57:31 -0300607struct em28xx_audio {
608 char name[50];
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500609 unsigned int num_urb;
Mauro Carvalho Chehab1b3fd2d2014-01-10 05:53:24 -0300610 char **transfer_buffer;
611 struct urb **urb;
Mauro Carvalho Chehab6d794682008-01-05 09:57:31 -0300612 struct usb_device *udev;
613 unsigned int capture_transfer_done;
614 struct snd_pcm_substream *capture_pcm_substream;
615
616 unsigned int hwptr_done_capture;
617 struct snd_card *sndcard;
618
Mauro Carvalho Chehaba02b9c22014-01-13 03:34:23 -0300619 size_t period;
620
Robert Krakorac744dff2009-02-08 13:10:39 -0300621 int users;
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500622 spinlock_t slock; /* Protects struct em28xx_audio */
Frank Schaefera5c075c2014-03-24 16:33:25 -0300623
624 /* Controls streaming */
625 struct work_struct wq_trigger; /* trigger to start/stop audio */
626 atomic_t stream_started; /* stream should be running if true */
Mauro Carvalho Chehab6d794682008-01-05 09:57:31 -0300627};
628
Mauro Carvalho Chehab52284c32008-04-17 21:38:38 -0300629struct em28xx;
630
Frank Schaefera3ea4bf2013-03-26 13:38:36 -0300631enum em28xx_i2c_algo_type {
632 EM28XX_I2C_ALGO_EM28XX = 0,
633 EM28XX_I2C_ALGO_EM2800,
634 EM28XX_I2C_ALGO_EM25XX_BUS_B,
635};
636
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -0300637struct em28xx_i2c_bus {
638 struct em28xx *dev;
639
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500640 unsigned int bus;
Frank Schaefera3ea4bf2013-03-26 13:38:36 -0300641 enum em28xx_i2c_algo_type algo_type;
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -0300642};
643
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800644/* main device struct */
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800645struct em28xx {
Mauro Carvalho Chehab47677e52014-03-05 11:21:07 -0300646 struct kref ref;
647
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500648 // Sub-module data
Frank Schaefer95d26082014-03-24 16:33:09 -0300649 struct em28xx_v4l2 *v4l2;
Frank Schaefer67430332014-03-24 16:33:07 -0300650 struct em28xx_dvb *dvb;
651 struct em28xx_audio adev;
652 struct em28xx_IR *ir;
653
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500654 // generic device properties
655 int model; // index in the device_data struct
656 int devno; // marks the number of this device
Devin Heitmueller600bd7f2008-11-12 02:05:02 -0300657 enum em28xx_chip_id chip_id;
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -0300658
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500659 unsigned int is_em25xx:1; // em25xx/em276x/7x/8x family bridge
660 unsigned int disconnected:1; // device has been diconnected
Mauro Carvalho Chehab01c28192013-12-22 13:27:02 -0300661 unsigned int has_video:1;
Mauro Carvalho Chehabce679432013-12-22 13:13:41 -0300662 unsigned int is_audio_only:1;
Mauro Carvalho Chehabaa629802018-03-01 10:08:42 -0500663 unsigned int is_webcam:1;
664 unsigned int has_msp34xx:1;
Mauro Carvalho Chehabcf68c222018-03-01 12:54:06 -0500665 unsigned int i2c_speed:2;
Frank Schaefer920f1e42014-09-13 05:52:21 -0300666 enum em28xx_int_audio_type int_audio_type;
Frank Schaeferc5874202014-09-13 05:52:20 -0300667 enum em28xx_usb_audio_type usb_audio_type;
Brad Lovebe7fd3c2018-01-04 19:04:11 -0500668 unsigned char name[32];
Frank Schaefer2665c292012-12-27 19:02:43 -0300669
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -0300670 struct em28xx_board board;
671
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500672 enum em28xx_sensor em28xx_sensor; // camera specific
Mauro Carvalho Chehab527f09a2009-07-12 11:04:15 -0300673
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500674 // Some older em28xx chips needs a waiting time after writing
Mauro Carvalho Chehab89b329e2008-04-17 21:42:14 -0300675 unsigned int wait_after_write;
676
Mauro Carvalho Chehab74f38a82008-01-05 09:54:58 -0300677 struct list_head devlist;
678
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500679 u32 i2s_speed; // I2S speed for audio digital stream
Mauro Carvalho Chehab9bb13a62006-01-09 15:25:37 -0200680
Mauro Carvalho Chehab35643942008-11-19 12:01:33 -0300681 struct em28xx_audio_mode audio_mode;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800682
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500683 int tuner_type; // type of the tuner
Mauro Carvalho Chehabc7a45e52013-03-05 06:55:26 -0300684
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500685 // i2c i/o
Mauro Carvalho Chehabc7a45e52013-03-05 06:55:26 -0300686 struct i2c_adapter i2c_adap[NUM_I2C_BUSES];
687 struct i2c_client i2c_client[NUM_I2C_BUSES];
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -0300688 struct em28xx_i2c_bus i2c_bus[NUM_I2C_BUSES];
689
Frank Schaefer87b52432013-03-03 15:37:40 -0300690 unsigned char eeprom_addrwidth_16bit:1;
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500691 unsigned int def_i2c_bus; // Default I2C bus
692 unsigned int cur_i2c_bus; // Current I2C bus
Mauro Carvalho Chehabaab31252013-03-05 06:55:28 -0300693 struct rt_mutex i2c_bus_lock;
Mauro Carvalho Chehabc7a45e52013-03-05 06:55:26 -0300694
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500695 // video for linux
696 unsigned int ctl_input; // selected input
697 unsigned int ctl_ainput;// selected audio input
698 unsigned int ctl_aoutput;// selected audio output
Mauro Carvalho Chehab258c4302018-09-14 13:13:15 -0400699 enum em28xx_amux amux_map[MAX_EM28XX_INPUT];
700
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800701 int mute;
702 int volume;
Frank Schaefer753aee72014-03-24 16:33:14 -0300703
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500704 unsigned long hash; // eeprom hash - for boards with generic ID
705 unsigned long i2c_hash; // i2c devicelist hash -
706 // for boards with generic ID
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -0300707
Mauro Carvalho Chehabd7448a82008-01-05 09:59:03 -0300708 struct work_struct request_module_wk;
709
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500710 // locks
711 struct mutex lock; /* protects em28xx struct */
Mauro Carvalho Chehabf2a2e492008-11-19 06:17:44 -0300712 struct mutex ctrl_urb_lock; /* protects urb_buf */
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800713
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500714 // resources in use
Devin Heitmueller8c873d32009-09-03 00:23:27 -0300715 unsigned int resources;
716
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500717 // eeprom content
Frank Schaefer510e8842013-03-03 15:37:43 -0300718 u8 *eedata;
719 u16 eedata_len;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800720
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500721 // Isoc control struct
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300722 struct em28xx_dmaqueue vidq;
Devin Heitmueller28abf0832009-09-01 01:54:54 -0300723 struct em28xx_dmaqueue vbiq;
Frank Schaefer74209dc2012-11-08 14:11:37 -0300724 struct em28xx_usb_ctl usb_ctl;
Mauro Carvalho Chehabad0ebb92008-04-13 14:37:52 -0300725
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500726 spinlock_t slock; /* Protects em28xx video/vbi/dvb IRQ stream data */
Mauro Carvalho Chehabc4a98792008-11-18 14:51:08 -0300727
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500728 // usb transfer
729 struct usb_interface *intf; // the usb interface
730 u8 ifnum; // number of the assigned usb interface
731 u8 analog_ep_isoc; // address of isoc endpoint for analog
732 u8 analog_ep_bulk; // address of bulk endpoint for analog
733 u8 dvb_ep_isoc_ts2; // address of isoc endpoint for DVB TS2
734 u8 dvb_ep_bulk_ts2; // address of bulk endpoint for DVB TS2
735 u8 dvb_ep_isoc; // address of isoc endpoint for DVB
736 u8 dvb_ep_bulk; // address of bulk endpoint for DVB
737 int alt; // alternate setting
738 int max_pkt_size; // max packet size of the selected ep at alt
739 int packet_multiplier; // multiplier for wMaxPacketSize, used for
740 // URB buffer size definition
741 int num_alt; // number of alternative settings
742 unsigned int *alt_max_pkt_size_isoc; // array of isoc wMaxPacketSize
743 unsigned int analog_xfer_bulk:1; // use bulk instead of isoc
744 // transfers for analog
745 int dvb_alt_isoc; // alternate setting for DVB isoc transfers
746 unsigned int dvb_max_pkt_size_isoc; // isoc max packet size of the
747 // selected DVB ep at dvb_alt
748 unsigned int dvb_max_pkt_size_isoc_ts2; // isoc max packet size of the
749 // selected DVB ep at dvb_alt
750 unsigned int dvb_xfer_bulk:1; // use bulk instead of isoc
751 // transfers for DVB
752 char urb_buf[URB_MAX_CTRL_SIZE]; // urb control msg buffer
753
754 // helper funcs that call usb_control_msg
Mauro Carvalho Chehabfdf1bc92014-11-28 08:34:15 -0300755 int (*em28xx_write_regs)(struct em28xx *dev, u16 reg,
756 char *buf, int len);
757 int (*em28xx_read_reg)(struct em28xx *dev, u16 reg);
758 int (*em28xx_read_reg_req_len)(struct em28xx *dev, u8 req, u16 reg,
759 char *buf, int len);
760 int (*em28xx_write_regs_req)(struct em28xx *dev, u8 req, u16 reg,
761 char *buf, int len);
762 int (*em28xx_read_reg_req)(struct em28xx *dev, u8 req, u16 reg);
Mauro Carvalho Chehab3aefb792008-04-17 21:36:41 -0300763
764 enum em28xx_mode mode;
765
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500766 // Button state polling
Frank Schaeferf52226092013-12-01 18:06:52 -0300767 struct delayed_work buttons_query_work;
768 u8 button_polling_addresses[EM28XX_NUM_BUTTON_ADDRESSES_MAX];
Frank Schaefer77634812013-12-01 18:06:53 -0300769 u8 button_polling_last_values[EM28XX_NUM_BUTTON_ADDRESSES_MAX];
Frank Schaeferf52226092013-12-01 18:06:52 -0300770 u8 num_button_polling_addresses;
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500771 u16 button_polling_interval; // [ms]
772 // Snapshot button input device
773 char snapshot_button_path[30]; // path of the input dev
Devin Heitmuellera9fc52b2008-06-28 08:57:06 -0300774 struct input_dev *sbutton_input_dev;
Mauro Carvalho Chehab37ecc7b2016-01-27 07:07:24 -0200775
776#ifdef CONFIG_MEDIA_CONTROLLER
777 struct media_device *media_dev;
778 struct media_entity input_ent[MAX_EM28XX_INPUT];
779 struct media_pad input_pad[MAX_EM28XX_INPUT];
780#endif
Brad Lovebe7fd3c2018-01-04 19:04:11 -0500781
782 struct em28xx *dev_next;
783 int ts;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800784};
785
Mauro Carvalho Chehab47677e52014-03-05 11:21:07 -0300786#define kref_to_dev(d) container_of(d, struct em28xx, ref)
787
Mauro Carvalho Chehab6d794682008-01-05 09:57:31 -0300788struct em28xx_ops {
789 struct list_head next;
790 char *name;
791 int id;
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500792 int (*init)(struct em28xx *dev);
793 int (*fini)(struct em28xx *dev);
794 int (*suspend)(struct em28xx *dev);
795 int (*resume)(struct em28xx *dev);
Mauro Carvalho Chehaba3a048c2007-11-10 22:21:01 -0300796};
797
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800798/* Provided by em28xx-i2c.c */
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500799void em28xx_do_i2c_scan(struct em28xx *dev, unsigned int bus);
800int em28xx_i2c_register(struct em28xx *dev, unsigned int bus,
Frank Schaefera3ea4bf2013-03-26 13:38:36 -0300801 enum em28xx_i2c_algo_type algo_type);
Mauro Carvalho Chehabc69ce612018-03-03 11:49:27 -0500802int em28xx_i2c_unregister(struct em28xx *dev, unsigned int bus);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800803
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800804/* Provided by em28xx-core.c */
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800805int em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800806 char *buf, int len);
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800807int em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg);
808int em28xx_read_reg(struct em28xx *dev, u16 reg);
809int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800810 int len);
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800811int em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
Devin Heitmuellerb6972482008-11-20 09:52:20 -0300812int em28xx_write_reg(struct em28xx *dev, u16 reg, u8 val);
Mauro Carvalho Chehab1bad4292009-12-05 08:27:49 -0300813int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val,
Mauro Carvalho Chehabfdf1bc92014-11-28 08:34:15 -0300814 u8 bitmask);
Frank Schaefer6063d072013-12-01 18:06:56 -0300815int em28xx_toggle_reg_bits(struct em28xx *dev, u16 reg, u8 bitmask);
Devin Heitmuellerb6972482008-11-20 09:52:20 -0300816
Mauro Carvalho Chehab531c98e2008-12-22 13:18:27 -0300817int em28xx_read_ac97(struct em28xx *dev, u8 reg);
818int em28xx_write_ac97(struct em28xx *dev, u8 reg, u16 val);
819
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800820int em28xx_audio_analog_set(struct em28xx *dev);
Mauro Carvalho Chehab35643942008-11-19 12:01:33 -0300821int em28xx_audio_setup(struct em28xx *dev);
Mauro Carvalho Chehab539c96d2008-01-05 09:53:54 -0300822
Frank Schaefer6b8a3172013-12-01 18:06:55 -0300823const struct em28xx_led *em28xx_find_led(struct em28xx *dev,
824 enum em28xx_led_role role);
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800825int em28xx_capture_start(struct em28xx *dev, int start);
Frank Schaefer6ddd89d2012-11-08 14:11:41 -0300826int em28xx_alloc_urbs(struct em28xx *dev, enum em28xx_mode mode, int xfer_bulk,
827 int num_bufs, int max_pkt_size, int packet_multiplier);
Frank Schaefer057ca0d2012-11-08 14:11:42 -0300828int em28xx_init_usb_xfer(struct em28xx *dev, enum em28xx_mode mode,
829 int xfer_bulk,
830 int num_bufs, int max_pkt_size, int packet_multiplier,
831 int (*urb_data_copy)
832 (struct em28xx *dev, struct urb *urb));
Frank Schaeferafb177e2012-11-08 14:11:40 -0300833void em28xx_uninit_usb_xfer(struct em28xx *dev, enum em28xx_mode mode);
Gianluca Gennari5f5f1472012-03-22 08:48:17 -0300834void em28xx_stop_urbs(struct em28xx *dev);
Mauro Carvalho Chehabc67ec532008-04-17 21:48:00 -0300835int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
Mauro Carvalho Chehab0108ae72018-03-01 10:34:34 -0500836int em28xx_gpio_set(struct em28xx *dev, const struct em28xx_reg_seq *gpio);
Mauro Carvalho Chehab6d794682008-01-05 09:57:31 -0300837int em28xx_register_extension(struct em28xx_ops *dev);
838void em28xx_unregister_extension(struct em28xx_ops *dev);
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -0300839void em28xx_init_extension(struct em28xx *dev);
840void em28xx_close_extension(struct em28xx *dev);
Shuah Khan9c669b72014-02-21 21:50:13 -0300841int em28xx_suspend_extension(struct em28xx *dev);
842int em28xx_resume_extension(struct em28xx *dev);
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -0300843
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800844/* Provided by em28xx-cards.c */
Mauro Carvalho Chehab0108ae72018-03-01 10:34:34 -0500845extern const struct em28xx_board em28xx_boards[];
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800846extern struct usb_device_id em28xx_id_table[];
Michael Krufkyd7cba042008-09-12 13:31:45 -0300847int em28xx_tuner_callback(void *ptr, int component, int command, int arg);
Mauro Carvalho Chehabee972072014-01-12 11:08:22 -0300848void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl);
Mauro Carvalho Chehab47677e52014-03-05 11:21:07 -0300849void em28xx_free_device(struct kref *ref);
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -0300850
Frank Schaefer855ff382013-03-27 17:06:31 -0300851/* Provided by em28xx-camera.c */
852int em28xx_detect_sensor(struct em28xx *dev);
853int em28xx_init_camera(struct em28xx *dev);
854
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800855#endif