You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (452 commits) V4L/DVB (7731): tuner-xc2028: fix signal strength calculus V4L/DVB (7730): tuner-xc2028: Fix SCODE load for MTS firmwares V4L/DVB (7729): Fix VIDIOCGAP corruption in ivtv V4L/DVB (7728): tea5761: bugzilla #10462: tea5761 autodetection code were broken V4L/DVB (7726): cx23885: Enable cx23417 support on the HVR1800 V4L/DVB (7725): cx23885: Add generic cx23417 hardware encoder support V4L/DVB (7723): pvrusb2: Clean up input selection list generation in V4L interface V4L/DVB (7722): pvrusb2: Implement FM radio support for Gotview USB2.0 DVD 2 V4L/DVB (7721): pvrusb2: Restructure cx23416 firmware loading to have a common exit point V4L/DVB (7720): pvrusb2: Fix bad error code on cx23416 firmware load failure V4L/DVB (7719): pvrusb2: Implement input selection enforcement V4L/DVB (7718): pvrusb2-dvb: update Kbuild selections V4L/DVB (7717): pvrusb2-dvb: add DVB-T support for Hauppauge pvrusb2 model 73xxx V4L/DVB (7716): pvrusb2: clean up global functions V4L/DVB (7715): pvrusb2: Clean out all use of __FUNCTION__ V4L/DVB (7714): pvrusb2: Fix hang on module removal V4L/DVB (7713): pvrusb2: Implement cleaner DVB kernel thread shutdown V4L/DVB (7712): pvrusb2: Close connect/disconnect race V4L/DVB (7711): pvrusb2: Fix race on module unload V4L/DVB (7710): pvrusb2: Implement critical digital streaming quirk for onair devices ...
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
0 -> Unknown board (au0828)
|
||||
1 -> Hauppauge HVR950Q (au0828) [2040:7200]
|
||||
2 -> Hauppauge HVR850 (au0828) [2040:7240]
|
||||
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
|
||||
@@ -148,3 +148,5 @@
|
||||
147 -> VoodooTV 200 (USA) [121a:3000]
|
||||
148 -> DViCO FusionHDTV 2 [dbc0:d200]
|
||||
149 -> Typhoon TV-Tuner PCI (50684)
|
||||
150 -> Geovision GV-600 [008a:763c]
|
||||
151 -> Kozumi KTV-01C
|
||||
|
||||
@@ -5,3 +5,6 @@
|
||||
4 -> DViCO FusionHDTV5 Express [18ac:d500]
|
||||
5 -> Hauppauge WinTV-HVR1500Q [0070:7790,0070:7797]
|
||||
6 -> Hauppauge WinTV-HVR1500 [0070:7710,0070:7717]
|
||||
7 -> Hauppauge WinTV-HVR1200 [0070:71d1]
|
||||
8 -> Hauppauge WinTV-HVR1700 [0070:8101]
|
||||
9 -> Hauppauge WinTV-HVR1400 [0070:8010]
|
||||
|
||||
@@ -57,3 +57,12 @@
|
||||
56 -> Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder [0070:9600,0070:9601,0070:9602]
|
||||
57 -> ADS Tech Instant Video PCI [1421:0390]
|
||||
58 -> Pinnacle PCTV HD 800i [11bd:0051]
|
||||
59 -> DViCO FusionHDTV 5 PCI nano [18ac:d530]
|
||||
60 -> Pinnacle Hybrid PCTV [12ab:1788]
|
||||
61 -> Winfast TV2000 XP Global [107d:6f18]
|
||||
62 -> PowerColor Real Angel 330 [14f1:ea3d]
|
||||
63 -> Geniatech X8000-MT DVBT [14f1:8852]
|
||||
64 -> DViCO FusionHDTV DVB-T PRO [18ac:db30]
|
||||
65 -> DViCO FusionHDTV 7 Gold [18ac:d610]
|
||||
66 -> Prolink Pixelview MPEG 8000GT [1554:4935]
|
||||
67 -> Kworld PlusTV HD PCI 120 (ATSC 120) [17de:08c1]
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
24 -> KNC One TV-Station DVR [1894:a006]
|
||||
25 -> ASUS TV-FM 7133 [1043:4843]
|
||||
26 -> Pinnacle PCTV Stereo (saa7134) [11bd:002b]
|
||||
27 -> Manli MuchTV M-TV002/Behold TV 403 FM
|
||||
28 -> Manli MuchTV M-TV001/Behold TV 401
|
||||
27 -> Manli MuchTV M-TV002
|
||||
28 -> Manli MuchTV M-TV001
|
||||
29 -> Nagase Sangyo TransGear 3000TV [1461:050c]
|
||||
30 -> Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM) [1019:4cb4]
|
||||
31 -> Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM) [1019:4cb5]
|
||||
@@ -131,3 +131,12 @@
|
||||
130 -> Beholder BeholdTV M6 / BeholdTV M6 Extra [5ace:6190,5ace:6193]
|
||||
131 -> Twinhan Hybrid DTV-DVB 3056 PCI [1822:0022]
|
||||
132 -> Genius TVGO AM11MCE
|
||||
133 -> NXP Snake DVB-S reference design
|
||||
134 -> Medion/Creatix CTX953 Hybrid [16be:0010]
|
||||
135 -> MSI TV@nywhere A/D v1.1 [1462:8625]
|
||||
136 -> AVerMedia Cardbus TV/Radio (E506R) [1461:f436]
|
||||
137 -> AVerMedia Hybrid TV/Radio (A16D) [1461:f936]
|
||||
138 -> Avermedia M115 [1461:a836]
|
||||
139 -> Compro VideoMate T750 [185b:c900]
|
||||
140 -> Avermedia DVB-S Pro A700 [1461:a7a1]
|
||||
141 -> Avermedia DVB-S Hybrid+FM A700 [1461:a7a2]
|
||||
|
||||
@@ -686,11 +686,11 @@ sub main_firmware($$$$)
|
||||
write_hunk(812664, 192);
|
||||
|
||||
#
|
||||
# Firmware 58, type: SCODE FW HAS IF (0x60000000), IF = 4.50 MHz id: NTSC/M Jp (0000000000002000), size: 192
|
||||
# Firmware 58, type: SCODE FW MTS LCD NOGD MONO IF HAS IF (0x6002b004), IF = 4.50 MHz id: NTSC PAL/M PAL/N (000000000000b700), size: 192
|
||||
#
|
||||
|
||||
write_le32(0x60000000); # Type
|
||||
write_le64(0x00000000, 0x00002000); # ID
|
||||
write_le32(0x6002b004); # Type
|
||||
write_le64(0x00000000, 0x0000b700); # ID
|
||||
write_le16(4500); # IF
|
||||
write_le32(192); # Size
|
||||
write_hunk(807672, 192);
|
||||
@@ -706,10 +706,10 @@ sub main_firmware($$$$)
|
||||
write_hunk(807864, 192);
|
||||
|
||||
#
|
||||
# Firmware 60, type: SCODE FW DTV78 ZARLINK456 HAS IF (0x62000100), IF = 4.76 MHz id: (0000000000000000), size: 192
|
||||
# Firmware 60, type: SCODE FW DTV6 QAM DTV7 DTV78 DTV8 ZARLINK456 HAS IF (0x620003e0), IF = 4.76 MHz id: (0000000000000000), size: 192
|
||||
#
|
||||
|
||||
write_le32(0x62000100); # Type
|
||||
write_le32(0x620003e0); # Type
|
||||
write_le64(0x00000000, 0x00000000); # ID
|
||||
write_le16(4760); # IF
|
||||
write_le32(192); # Size
|
||||
@@ -726,30 +726,30 @@ sub main_firmware($$$$)
|
||||
write_hunk(811512, 192);
|
||||
|
||||
#
|
||||
# Firmware 62, type: SCODE FW DTV7 ZARLINK456 HAS IF (0x62000080), IF = 5.26 MHz id: (0000000000000000), size: 192
|
||||
# Firmware 62, type: SCODE FW HAS IF (0x60000000), IF = 5.26 MHz id: (0000000000000000), size: 192
|
||||
#
|
||||
|
||||
write_le32(0x62000080); # Type
|
||||
write_le32(0x60000000); # Type
|
||||
write_le64(0x00000000, 0x00000000); # ID
|
||||
write_le16(5260); # IF
|
||||
write_le32(192); # Size
|
||||
write_hunk(810552, 192);
|
||||
|
||||
#
|
||||
# Firmware 63, type: SCODE FW MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG NICAM/B (0000000800000007), size: 192
|
||||
# Firmware 63, type: SCODE FW MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG A2 NICAM (0000000f00000007), size: 192
|
||||
#
|
||||
|
||||
write_le32(0x60008000); # Type
|
||||
write_le64(0x00000008, 0x00000007); # ID
|
||||
write_le64(0x0000000f, 0x00000007); # ID
|
||||
write_le16(5320); # IF
|
||||
write_le32(192); # Size
|
||||
write_hunk(810744, 192);
|
||||
|
||||
#
|
||||
# Firmware 64, type: SCODE FW DTV8 CHINA HAS IF (0x64000200), IF = 5.40 MHz id: (0000000000000000), size: 192
|
||||
# Firmware 64, type: SCODE FW DTV7 DTV78 DTV8 DIBCOM52 CHINA HAS IF (0x65000380), IF = 5.40 MHz id: (0000000000000000), size: 192
|
||||
#
|
||||
|
||||
write_le32(0x64000200); # Type
|
||||
write_le32(0x65000380); # Type
|
||||
write_le64(0x00000000, 0x00000000); # ID
|
||||
write_le16(5400); # IF
|
||||
write_le32(192); # Size
|
||||
@@ -766,50 +766,50 @@ sub main_firmware($$$$)
|
||||
write_hunk(809592, 192);
|
||||
|
||||
#
|
||||
# Firmware 66, type: SCODE FW HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG A2/B (0000000200000007), size: 192
|
||||
# Firmware 66, type: SCODE FW HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG A2 (0000000300000007), size: 192
|
||||
#
|
||||
|
||||
write_le32(0x60000000); # Type
|
||||
write_le64(0x00000002, 0x00000007); # ID
|
||||
write_le64(0x00000003, 0x00000007); # ID
|
||||
write_le16(5640); # IF
|
||||
write_le32(192); # Size
|
||||
write_hunk(808440, 192);
|
||||
|
||||
#
|
||||
# Firmware 67, type: SCODE FW HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG NICAM/B (0000000800000007), size: 192
|
||||
# Firmware 67, type: SCODE FW HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG NICAM (0000000c00000007), size: 192
|
||||
#
|
||||
|
||||
write_le32(0x60000000); # Type
|
||||
write_le64(0x00000008, 0x00000007); # ID
|
||||
write_le64(0x0000000c, 0x00000007); # ID
|
||||
write_le16(5740); # IF
|
||||
write_le32(192); # Size
|
||||
write_hunk(808632, 192);
|
||||
|
||||
#
|
||||
# Firmware 68, type: SCODE FW DTV7 DIBCOM52 HAS IF (0x61000080), IF = 5.90 MHz id: (0000000000000000), size: 192
|
||||
# Firmware 68, type: SCODE FW HAS IF (0x60000000), IF = 5.90 MHz id: (0000000000000000), size: 192
|
||||
#
|
||||
|
||||
write_le32(0x61000080); # Type
|
||||
write_le32(0x60000000); # Type
|
||||
write_le64(0x00000000, 0x00000000); # ID
|
||||
write_le16(5900); # IF
|
||||
write_le32(192); # Size
|
||||
write_hunk(810360, 192);
|
||||
|
||||
#
|
||||
# Firmware 69, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/I (0000000000000010), size: 192
|
||||
# Firmware 69, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/DK PAL/I SECAM/K3 SECAM/L SECAM/Lc NICAM (0000000c04c000f0), size: 192
|
||||
#
|
||||
|
||||
write_le32(0x60008000); # Type
|
||||
write_le64(0x00000000, 0x00000010); # ID
|
||||
write_le64(0x0000000c, 0x04c000f0); # ID
|
||||
write_le16(6000); # IF
|
||||
write_le32(192); # Size
|
||||
write_hunk(808824, 192);
|
||||
|
||||
#
|
||||
# Firmware 70, type: SCODE FW DTV6 QAM F6MHZ HAS IF (0x68000060), IF = 6.20 MHz id: (0000000000000000), size: 192
|
||||
# Firmware 70, type: SCODE FW DTV6 QAM ATSC LG60 F6MHZ HAS IF (0x68050060), IF = 6.20 MHz id: (0000000000000000), size: 192
|
||||
#
|
||||
|
||||
write_le32(0x68000060); # Type
|
||||
write_le32(0x68050060); # Type
|
||||
write_le64(0x00000000, 0x00000000); # ID
|
||||
write_le16(6200); # IF
|
||||
write_le32(192); # Size
|
||||
@@ -846,11 +846,11 @@ sub main_firmware($$$$)
|
||||
write_hunk(809208, 192);
|
||||
|
||||
#
|
||||
# Firmware 74, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.50 MHz id: SECAM/K3 (0000000004000000), size: 192
|
||||
# Firmware 74, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.50 MHz id: PAL/DK SECAM/K3 SECAM/L NICAM (0000000c044000e0), size: 192
|
||||
#
|
||||
|
||||
write_le32(0x60008000); # Type
|
||||
write_le64(0x00000000, 0x04000000); # ID
|
||||
write_le64(0x0000000c, 0x044000e0); # ID
|
||||
write_le16(6500); # IF
|
||||
write_le32(192); # Size
|
||||
write_hunk(811128, 192);
|
||||
|
||||
@@ -30,7 +30,7 @@ config VIDEO_V4L2_COMMON
|
||||
depends on (I2C || I2C=n) && VIDEO_DEV
|
||||
default (I2C || I2C=n) && VIDEO_DEV
|
||||
|
||||
config VIDEO_V4L1
|
||||
config VIDEO_ALLOW_V4L1
|
||||
bool "Enable Video For Linux API 1 (DEPRECATED)"
|
||||
depends on VIDEO_DEV && VIDEO_V4L2_COMMON
|
||||
default VIDEO_DEV && VIDEO_V4L2_COMMON
|
||||
@@ -59,10 +59,15 @@ config VIDEO_V4L1_COMPAT
|
||||
If you are unsure as to whether this is required, answer Y.
|
||||
|
||||
config VIDEO_V4L2
|
||||
bool
|
||||
tristate
|
||||
depends on VIDEO_DEV && VIDEO_V4L2_COMMON
|
||||
default VIDEO_DEV && VIDEO_V4L2_COMMON
|
||||
|
||||
config VIDEO_V4L1
|
||||
tristate
|
||||
depends on VIDEO_DEV && VIDEO_V4L2_COMMON && VIDEO_ALLOW_V4L1
|
||||
default VIDEO_DEV && VIDEO_V4L2_COMMON && VIDEO_ALLOW_V4L1
|
||||
|
||||
source "drivers/media/video/Kconfig"
|
||||
|
||||
source "drivers/media/radio/Kconfig"
|
||||
@@ -155,7 +160,7 @@ config VIDEOBUF_GEN
|
||||
tristate
|
||||
|
||||
config VIDEOBUF_DMA_SG
|
||||
depends on PCI
|
||||
depends on HAS_DMA
|
||||
select VIDEOBUF_GEN
|
||||
tristate
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ static int repeat = 1;
|
||||
module_param(repeat, int, 0444);
|
||||
MODULE_PARM_DESC(repeat,"auto-repeat for IR keys (default: on)");
|
||||
|
||||
static int debug = 0; /* debug level (0,1,2) */
|
||||
static int debug; /* debug level (0,1,2) */
|
||||
module_param(debug, int, 0644);
|
||||
|
||||
#define dprintk(level, fmt, arg...) if (debug >= level) \
|
||||
|
||||
@@ -212,6 +212,51 @@ IR_KEYTAB_TYPE ir_codes_pixelview[IR_KEYTAB_SIZE] = {
|
||||
|
||||
EXPORT_SYMBOL_GPL(ir_codes_pixelview);
|
||||
|
||||
/*
|
||||
Mauro Carvalho Chehab <mchehab@infradead.org>
|
||||
present on PV MPEG 8000GT
|
||||
*/
|
||||
IR_KEYTAB_TYPE ir_codes_pixelview_new[IR_KEYTAB_SIZE] = {
|
||||
[0x3c] = KEY_PAUSE, /* Timeshift */
|
||||
[0x12] = KEY_POWER,
|
||||
|
||||
[0x3d] = KEY_1,
|
||||
[0x38] = KEY_2,
|
||||
[0x18] = KEY_3,
|
||||
[0x35] = KEY_4,
|
||||
[0x39] = KEY_5,
|
||||
[0x15] = KEY_6,
|
||||
[0x36] = KEY_7,
|
||||
[0x3a] = KEY_8,
|
||||
[0x1e] = KEY_9,
|
||||
[0x3e] = KEY_0,
|
||||
|
||||
[0x1c] = KEY_AGAIN, /* LOOP */
|
||||
[0x3f] = KEY_MEDIA, /* Source */
|
||||
[0x1f] = KEY_LAST, /* +100 */
|
||||
[0x1b] = KEY_MUTE,
|
||||
|
||||
[0x17] = KEY_CHANNELDOWN,
|
||||
[0x16] = KEY_CHANNELUP,
|
||||
[0x10] = KEY_VOLUMEUP,
|
||||
[0x14] = KEY_VOLUMEDOWN,
|
||||
[0x13] = KEY_ZOOM,
|
||||
|
||||
[0x19] = KEY_SHUFFLE, /* SNAPSHOT */
|
||||
[0x1a] = KEY_SEARCH, /* scan */
|
||||
|
||||
[0x37] = KEY_REWIND, /* << */
|
||||
[0x32] = KEY_RECORD, /* o (red) */
|
||||
[0x33] = KEY_FORWARD, /* >> */
|
||||
[0x11] = KEY_STOP, /* square */
|
||||
[0x3b] = KEY_PLAY, /* > */
|
||||
[0x30] = KEY_PLAYPAUSE, /* || */
|
||||
|
||||
[0x31] = KEY_TV,
|
||||
[0x34] = KEY_RADIO,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(ir_codes_pixelview_new);
|
||||
|
||||
IR_KEYTAB_TYPE ir_codes_nebula[IR_KEYTAB_SIZE] = {
|
||||
[ 0x00 ] = KEY_0,
|
||||
[ 0x01 ] = KEY_1,
|
||||
@@ -726,7 +771,11 @@ IR_KEYTAB_TYPE ir_codes_flyvideo[IR_KEYTAB_SIZE] = {
|
||||
[ 0x12 ] = KEY_CHANNELUP, // Channel +
|
||||
[ 0x13 ] = KEY_CHANNELDOWN, // Channel -
|
||||
[ 0x06 ] = KEY_AGAIN, // Recall
|
||||
[ 0x10 ] = KEY_ENTER, // Enter
|
||||
[ 0x10 ] = KEY_ENTER, // Enter
|
||||
|
||||
[ 0x19 ] = KEY_BACK, // Rewind ( <<< )
|
||||
[ 0x1f ] = KEY_FORWARD, // Forward ( >>> )
|
||||
[ 0x0a ] = KEY_ANGLE, // (no label, may be used as the PAUSE button)
|
||||
};
|
||||
|
||||
EXPORT_SYMBOL_GPL(ir_codes_flyvideo);
|
||||
@@ -1157,7 +1206,8 @@ EXPORT_SYMBOL_GPL(ir_codes_purpletv);
|
||||
|
||||
/* Mapping for the 28 key remote control as seen at
|
||||
http://www.sednacomputer.com/photo/cardbus-tv.jpg
|
||||
Pavel Mihaylov <bin@bash.info> */
|
||||
Pavel Mihaylov <bin@bash.info>
|
||||
Also for the remote bundled with Kozumi KTV-01C card */
|
||||
IR_KEYTAB_TYPE ir_codes_pctv_sedna[IR_KEYTAB_SIZE] = {
|
||||
[ 0x00 ] = KEY_0,
|
||||
[ 0x01 ] = KEY_1,
|
||||
@@ -1188,6 +1238,11 @@ IR_KEYTAB_TYPE ir_codes_pctv_sedna[IR_KEYTAB_SIZE] = {
|
||||
[ 0x1c ] = KEY_RADIO, /* FM Radio */
|
||||
[ 0x1d ] = KEY_RECORD,
|
||||
[ 0x1e ] = KEY_PAUSE,
|
||||
/* additional codes for Kozumi's remote */
|
||||
[0x14] = KEY_INFO, /* OSD */
|
||||
[0x16] = KEY_OK, /* OK */
|
||||
[0x17] = KEY_DIGITS, /* Plus */
|
||||
[0x1f] = KEY_PLAY, /* Play */
|
||||
};
|
||||
|
||||
EXPORT_SYMBOL_GPL(ir_codes_pctv_sedna);
|
||||
@@ -1988,6 +2043,76 @@ IR_KEYTAB_TYPE ir_codes_behold[IR_KEYTAB_SIZE] = {
|
||||
|
||||
EXPORT_SYMBOL_GPL(ir_codes_behold);
|
||||
|
||||
/* Beholder Intl. Ltd. 2008
|
||||
* Dmitry Belimov d.belimov@google.com
|
||||
* Keytable is used by BeholdTV Columbus
|
||||
* The "ascii-art picture" below (in comments, first row
|
||||
* is the keycode in hex, and subsequent row(s) shows
|
||||
* the button labels (several variants when appropriate)
|
||||
* helps to descide which keycodes to assign to the buttons.
|
||||
*/
|
||||
IR_KEYTAB_TYPE ir_codes_behold_columbus[IR_KEYTAB_SIZE] = {
|
||||
|
||||
/* 0x13 0x11 0x1C 0x12 *
|
||||
* Mute Source TV/FM Power *
|
||||
* */
|
||||
|
||||
[0x13] = KEY_MUTE,
|
||||
[0x11] = KEY_PROPS,
|
||||
[0x1C] = KEY_TUNER, /* KEY_TV/KEY_RADIO */
|
||||
[0x12] = KEY_POWER,
|
||||
|
||||
/* 0x01 0x02 0x03 0x0D *
|
||||
* 1 2 3 Stereo *
|
||||
* *
|
||||
* 0x04 0x05 0x06 0x19 *
|
||||
* 4 5 6 Snapshot *
|
||||
* *
|
||||
* 0x07 0x08 0x09 0x10 *
|
||||
* 7 8 9 Zoom *
|
||||
* */
|
||||
[0x01] = KEY_1,
|
||||
[0x02] = KEY_2,
|
||||
[0x03] = KEY_3,
|
||||
[0x0D] = KEY_SETUP, /* Setup key */
|
||||
[0x04] = KEY_4,
|
||||
[0x05] = KEY_5,
|
||||
[0x06] = KEY_6,
|
||||
[0x19] = KEY_BOOKMARKS, /* Snapshot key */
|
||||
[0x07] = KEY_7,
|
||||
[0x08] = KEY_8,
|
||||
[0x09] = KEY_9,
|
||||
[0x10] = KEY_ZOOM,
|
||||
|
||||
/* 0x0A 0x00 0x0B 0x0C *
|
||||
* RECALL 0 ChannelUp VolumeUp *
|
||||
* */
|
||||
[0x0A] = KEY_AGAIN,
|
||||
[0x00] = KEY_0,
|
||||
[0x0B] = KEY_CHANNELUP,
|
||||
[0x0C] = KEY_VOLUMEUP,
|
||||
|
||||
/* 0x1B 0x1D 0x15 0x18 *
|
||||
* Timeshift Record ChannelDown VolumeDown *
|
||||
* */
|
||||
|
||||
[0x1B] = KEY_REWIND,
|
||||
[0x1D] = KEY_RECORD,
|
||||
[0x15] = KEY_CHANNELDOWN,
|
||||
[0x18] = KEY_VOLUMEDOWN,
|
||||
|
||||
/* 0x0E 0x1E 0x0F 0x1A *
|
||||
* Stop Pause Previouse Next *
|
||||
* */
|
||||
|
||||
[0x0E] = KEY_STOP,
|
||||
[0x1E] = KEY_PAUSE,
|
||||
[0x0F] = KEY_PREVIOUS,
|
||||
[0x1A] = KEY_NEXT,
|
||||
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(ir_codes_behold_columbus);
|
||||
|
||||
/*
|
||||
* Remote control for the Genius TVGO A11MCE
|
||||
* Adrian Pardini <pardo.bsso@gmail.com>
|
||||
@@ -2033,3 +2158,46 @@ IR_KEYTAB_TYPE ir_codes_genius_tvgo_a11mce[IR_KEYTAB_SIZE] = {
|
||||
[0x50] = KEY_BLUE,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(ir_codes_genius_tvgo_a11mce);
|
||||
|
||||
/*
|
||||
* Remote control for Powercolor Real Angel 330
|
||||
* Daniel Fraga <fragabr@gmail.com>
|
||||
*/
|
||||
IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE] = {
|
||||
[0x38] = KEY_SWITCHVIDEOMODE, /* switch inputs */
|
||||
[0x0c] = KEY_MEDIA, /* Turn ON/OFF App */
|
||||
[0x00] = KEY_0,
|
||||
[0x01] = KEY_1,
|
||||
[0x02] = KEY_2,
|
||||
[0x03] = KEY_3,
|
||||
[0x04] = KEY_4,
|
||||
[0x05] = KEY_5,
|
||||
[0x06] = KEY_6,
|
||||
[0x07] = KEY_7,
|
||||
[0x08] = KEY_8,
|
||||
[0x09] = KEY_9,
|
||||
[0x0a] = KEY_DIGITS, /* single, double, tripple digit */
|
||||
[0x29] = KEY_PREVIOUS, /* previous channel */
|
||||
[0x12] = KEY_BRIGHTNESSUP,
|
||||
[0x13] = KEY_BRIGHTNESSDOWN,
|
||||
[0x2b] = KEY_MODE, /* stereo/mono */
|
||||
[0x2c] = KEY_TEXT, /* teletext */
|
||||
[0x20] = KEY_UP, /* channel up */
|
||||
[0x21] = KEY_DOWN, /* channel down */
|
||||
[0x10] = KEY_RIGHT, /* volume up */
|
||||
[0x11] = KEY_LEFT, /* volume down */
|
||||
[0x0d] = KEY_MUTE,
|
||||
[0x1f] = KEY_RECORD,
|
||||
[0x17] = KEY_PLAY,
|
||||
[0x16] = KEY_PAUSE,
|
||||
[0x0b] = KEY_STOP,
|
||||
[0x27] = KEY_FASTFORWARD,
|
||||
[0x26] = KEY_REWIND,
|
||||
[0x1e] = KEY_SEARCH, /* autoscan */
|
||||
[0x0e] = KEY_SHUFFLE, /* snapshot */
|
||||
[0x2d] = KEY_SETUP,
|
||||
[0x0f] = KEY_SCREEN, /* full screen */
|
||||
[0x14] = KEY_RADIO, /* FM radio */
|
||||
[0x25] = KEY_POWER, /* power */
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel);
|
||||
|
||||
@@ -74,7 +74,7 @@ static inline int saa7146_wait_for_debi_done_sleep(struct saa7146_dev *dev,
|
||||
if (err) {
|
||||
printk(KERN_ERR "%s: %s timed out while waiting for "
|
||||
"registers getting programmed\n",
|
||||
dev->name, __FUNCTION__);
|
||||
dev->name, __func__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
msleep(1);
|
||||
@@ -89,7 +89,7 @@ static inline int saa7146_wait_for_debi_done_sleep(struct saa7146_dev *dev,
|
||||
saa7146_read(dev, MC2);
|
||||
if (err) {
|
||||
DEB_S(("%s: %s timed out while waiting for transfer "
|
||||
"completion\n", dev->name, __FUNCTION__));
|
||||
"completion\n", dev->name, __func__));
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
msleep(1);
|
||||
@@ -111,7 +111,7 @@ static inline int saa7146_wait_for_debi_done_busyloop(struct saa7146_dev *dev,
|
||||
if (!loops--) {
|
||||
printk(KERN_ERR "%s: %s timed out while waiting for "
|
||||
"registers getting programmed\n",
|
||||
dev->name, __FUNCTION__);
|
||||
dev->name, __func__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
udelay(1);
|
||||
@@ -125,7 +125,7 @@ static inline int saa7146_wait_for_debi_done_busyloop(struct saa7146_dev *dev,
|
||||
saa7146_read(dev, MC2);
|
||||
if (!loops--) {
|
||||
DEB_S(("%s: %s timed out while waiting for transfer "
|
||||
"completion\n", dev->name, __FUNCTION__));
|
||||
"completion\n", dev->name, __func__));
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
udelay(5);
|
||||
|
||||
@@ -203,7 +203,7 @@ static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_d
|
||||
return -ERESTARTSYS;
|
||||
|
||||
printk(KERN_WARNING "%s %s [irq]: timed out waiting for end of xfer\n",
|
||||
dev->name, __FUNCTION__);
|
||||
dev->name, __func__);
|
||||
return -EIO;
|
||||
}
|
||||
status = saa7146_read(dev, I2C_STATUS);
|
||||
@@ -221,7 +221,7 @@ static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_d
|
||||
}
|
||||
if (time_after(jiffies,timeout)) {
|
||||
printk(KERN_WARNING "%s %s: timed out waiting for MC2\n",
|
||||
dev->name, __FUNCTION__);
|
||||
dev->name, __func__);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
@@ -238,7 +238,7 @@ static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_d
|
||||
* (no answer from nonexisistant device...)
|
||||
*/
|
||||
printk(KERN_WARNING "%s %s [poll]: timed out waiting for end of xfer\n",
|
||||
dev->name, __FUNCTION__);
|
||||
dev->name, __func__);
|
||||
return -EIO;
|
||||
}
|
||||
if (++trial < 50 && short_delay)
|
||||
|
||||
@@ -407,8 +407,8 @@ static int vbi_open(struct saa7146_dev *dev, struct file *file)
|
||||
fh->vbi_fmt.start[1] = 312;
|
||||
fh->vbi_fmt.count[1] = 16;
|
||||
|
||||
videobuf_queue_pci_init(&fh->vbi_q, &vbi_qops,
|
||||
dev->pci, &dev->slock,
|
||||
videobuf_queue_sg_init(&fh->vbi_q, &vbi_qops,
|
||||
&dev->pci->dev, &dev->slock,
|
||||
V4L2_BUF_TYPE_VBI_CAPTURE,
|
||||
V4L2_FIELD_SEQ_TB, // FIXME: does this really work?
|
||||
sizeof(struct saa7146_buf),
|
||||
|
||||
@@ -1410,8 +1410,8 @@ static int video_open(struct saa7146_dev *dev, struct file *file)
|
||||
sfmt = format_by_fourcc(dev,fh->video_fmt.pixelformat);
|
||||
fh->video_fmt.sizeimage = (fh->video_fmt.width * fh->video_fmt.height * sfmt->depth)/8;
|
||||
|
||||
videobuf_queue_pci_init(&fh->video_q, &video_qops,
|
||||
dev->pci, &dev->slock,
|
||||
videobuf_queue_sg_init(&fh->video_q, &video_qops,
|
||||
&dev->pci->dev, &dev->slock,
|
||||
V4L2_BUF_TYPE_VIDEO_CAPTURE,
|
||||
V4L2_FIELD_INTERLACED,
|
||||
sizeof(struct saa7146_buf),
|
||||
|
||||
@@ -9,6 +9,11 @@ config DVB_B2C2_FLEXCOP
|
||||
select DVB_STV0297 if !DVB_FE_CUSTOMISE
|
||||
select DVB_BCM3510 if !DVB_FE_CUSTOMISE
|
||||
select DVB_LGDT330X if !DVB_FE_CUSTOMISE
|
||||
select TUNER_SIMPLE if !DVB_FE_CUSTOMISE
|
||||
select DVB_S5H1420 if !DVB_FE_CUSTOMISE
|
||||
select DVB_TUNER_ITD1000 if !DVB_FE_CUSTOMISE
|
||||
select DVB_ISL6421 if !DVB_FE_CUSTOMISE
|
||||
select DVB_CX24123 if !DVB_FE_CUSTOMISE
|
||||
help
|
||||
Support for the digital TV receiver chip made by B2C2 Inc. included in
|
||||
Technisats PCI cards and USB boxes.
|
||||
|
||||
@@ -2,6 +2,7 @@ b2c2-flexcop-objs = flexcop.o flexcop-fe-tuner.o flexcop-i2c.o \
|
||||
flexcop-sram.o flexcop-eeprom.o flexcop-misc.o flexcop-hw-filter.o
|
||||
obj-$(CONFIG_DVB_B2C2_FLEXCOP) += b2c2-flexcop.o
|
||||
|
||||
|
||||
ifneq ($(CONFIG_DVB_B2C2_FLEXCOP_PCI),)
|
||||
b2c2-flexcop-objs += flexcop-dma.o
|
||||
endif
|
||||
@@ -13,3 +14,4 @@ b2c2-flexcop-usb-objs = flexcop-usb.o
|
||||
obj-$(CONFIG_DVB_B2C2_FLEXCOP_USB) += b2c2-flexcop-usb.o
|
||||
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
|
||||
EXTRA_CFLAGS += -Idrivers/media/video/
|
||||
|
||||
@@ -44,6 +44,14 @@ struct flexcop_dma {
|
||||
u32 size; /* size of each address in bytes */
|
||||
};
|
||||
|
||||
struct flexcop_i2c_adapter {
|
||||
struct flexcop_device *fc;
|
||||
struct i2c_adapter i2c_adap;
|
||||
|
||||
u8 no_base_addr;
|
||||
flexcop_i2c_port_t port;
|
||||
};
|
||||
|
||||
/* Control structure for data definitions that are common to
|
||||
* the B2C2-based PCI and USB devices.
|
||||
*/
|
||||
@@ -72,7 +80,7 @@ struct flexcop_device {
|
||||
struct dmx_frontend mem_frontend;
|
||||
int (*fe_sleep) (struct dvb_frontend *);
|
||||
|
||||
struct i2c_adapter i2c_adap;
|
||||
struct flexcop_i2c_adapter fc_i2c_adap[3];
|
||||
struct mutex i2c_mutex;
|
||||
struct module *owner;
|
||||
|
||||
@@ -87,7 +95,8 @@ struct flexcop_device {
|
||||
int (*write_ibi_reg) (struct flexcop_device *, flexcop_ibi_register, flexcop_ibi_value);
|
||||
|
||||
|
||||
int (*i2c_request) (struct flexcop_device*, flexcop_access_op_t, flexcop_i2c_port_t, u8 chipaddr, u8 addr, u8 *buf, u16 len);
|
||||
int (*i2c_request) (struct flexcop_i2c_adapter*,
|
||||
flexcop_access_op_t, u8 chipaddr, u8 addr, u8 *buf, u16 len);
|
||||
int (*stream_control) (struct flexcop_device*, int);
|
||||
|
||||
int (*get_mac_addr) (struct flexcop_device *fc, int extended);
|
||||
@@ -128,8 +137,8 @@ int flexcop_eeprom_check_mac_addr(struct flexcop_device *fc, int extended);
|
||||
* one. We have it in flexcop-i2c.c, because it is going via the actual
|
||||
* I2C-channel of the flexcop.
|
||||
*/
|
||||
int flexcop_i2c_request(struct flexcop_device*, flexcop_access_op_t,
|
||||
flexcop_i2c_port_t, u8 chipaddr, u8 addr, u8 *buf, u16 len);
|
||||
int flexcop_i2c_request(struct flexcop_i2c_adapter*, flexcop_access_op_t,
|
||||
u8 chipaddr, u8 addr, u8 *buf, u16 len);
|
||||
|
||||
/* from flexcop-sram.c */
|
||||
int flexcop_sram_set_dest(struct flexcop_device *fc, flexcop_sram_dest_t dest, flexcop_sram_dest_target_t target);
|
||||
|
||||
@@ -112,7 +112,7 @@ static int flexcop_dma_remap(struct flexcop_device *fc,
|
||||
{
|
||||
flexcop_ibi_register r = (dma_idx & FC_DMA_1) ? dma1_00c : dma2_01c;
|
||||
flexcop_ibi_value v = fc->read_ibi_reg(fc,r);
|
||||
deb_info("%s\n",__FUNCTION__);
|
||||
deb_info("%s\n",__func__);
|
||||
v.dma_0xc.remap_enable = onoff;
|
||||
fc->write_ibi_reg(fc,r,v);
|
||||
return 0;
|
||||
@@ -162,7 +162,7 @@ int flexcop_dma_config_timer(struct flexcop_device *fc,
|
||||
|
||||
flexcop_dma_remap(fc,dma_idx,0);
|
||||
|
||||
deb_info("%s\n",__FUNCTION__);
|
||||
deb_info("%s\n",__func__);
|
||||
v.dma_0x4_write.dmatimer = cycles;
|
||||
fc->write_ibi_reg(fc,r,v);
|
||||
return 0;
|
||||
|
||||
@@ -114,15 +114,18 @@ static int flexcop_eeprom_request(struct flexcop_device *fc, flexcop_access_op_t
|
||||
{
|
||||
int i,ret = 0;
|
||||
u8 chipaddr = 0x50 | ((addr >> 8) & 3);
|
||||
for (i = 0; i < retries; i++)
|
||||
if ((ret = fc->i2c_request(fc,op,FC_I2C_PORT_EEPROM,chipaddr,addr & 0xff,buf,len)) == 0)
|
||||
for (i = 0; i < retries; i++) {
|
||||
ret = fc->i2c_request(&fc->fc_i2c_adap[1], op, chipaddr,
|
||||
addr & 0xff, buf, len);
|
||||
if (ret == 0)
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int flexcop_eeprom_lrc_read(struct flexcop_device *fc, u16 addr, u8 *buf, u16 len, int retries)
|
||||
{
|
||||
int ret = flexcop_eeprom_request(fc,FC_READ,addr,buf,len,retries);
|
||||
int ret = flexcop_eeprom_request(fc, FC_READ, addr, buf, len, retries);
|
||||
if (ret == 0)
|
||||
if (calc_lrc(buf, len - 1) != buf[len - 1])
|
||||
ret = -EINVAL;
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
*
|
||||
* see flexcop.c for copyright information.
|
||||
*/
|
||||
#include <media/tuner.h>
|
||||
|
||||
#include "flexcop.h"
|
||||
|
||||
#include "stv0299.h"
|
||||
@@ -15,6 +17,15 @@
|
||||
#include "mt312.h"
|
||||
#include "lgdt330x.h"
|
||||
#include "dvb-pll.h"
|
||||
#include "tuner-simple.h"
|
||||
|
||||
#include "s5h1420.h"
|
||||
#include "itd1000.h"
|
||||
|
||||
#include "cx24123.h"
|
||||
#include "cx24113.h"
|
||||
|
||||
#include "isl6421.h"
|
||||
|
||||
/* lnb control */
|
||||
|
||||
@@ -180,13 +191,13 @@ static int samsung_tbmu24112_tuner_set_params(struct dvb_frontend* fe, struct dv
|
||||
buf[2] = 0x84; /* 0xC4 */
|
||||
buf[3] = 0x08;
|
||||
|
||||
if (params->frequency < 1500000) buf[3] |= 0x10;
|
||||
if (params->frequency < 1500000)
|
||||
buf[3] |= 0x10;
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
if (i2c_transfer(&fc->i2c_adap, &msg, 1) != 1) {
|
||||
if (i2c_transfer(&fc->fc_i2c_adap[0].i2c_adap, &msg, 1) != 1)
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -241,7 +252,7 @@ static struct stv0299_config samsung_tbmu24112_config = {
|
||||
.mclk = 88000000UL,
|
||||
.invert = 0,
|
||||
.skip_reinit = 0,
|
||||
.lock_output = STV0229_LOCKOUTPUT_LK,
|
||||
.lock_output = STV0299_LOCKOUTPUT_LK,
|
||||
.volt13_op0_op1 = STV0299_VOLT13_OP1,
|
||||
.min_delay_ms = 100,
|
||||
.set_symbol_rate = samsung_tbmu24112_set_symbol_rate,
|
||||
@@ -337,7 +348,7 @@ static int skystar23_samsung_tbdu18132_tuner_set_params(struct dvb_frontend* fe,
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
if (i2c_transfer(&fc->i2c_adap, &msg, 1) != 1)
|
||||
if (i2c_transfer(&fc->fc_i2c_adap[0].i2c_adap, &msg, 1) != 1)
|
||||
return -EIO;
|
||||
return 0;
|
||||
}
|
||||
@@ -386,10 +397,11 @@ static int alps_tdee4_stv0297_tuner_set_params(struct dvb_frontend* fe,
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
deb_tuner("tuner buffer for %d Hz: %x %x %x %x\n",fep->frequency, buf[0],buf[1],buf[2],buf[3]);
|
||||
ret = fc->i2c_request(fc, FC_WRITE, FC_I2C_PORT_TUNER, 0x61, buf[0], &buf[1], 3);
|
||||
ret = fc->i2c_request(&fc->fc_i2c_adap[2],
|
||||
FC_WRITE, 0x61, buf[0], &buf[1], 3);
|
||||
deb_tuner("tuner write returned: %d\n",ret);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u8 alps_tdee4_stv0297_inittab[] = {
|
||||
@@ -472,56 +484,159 @@ static struct stv0297_config alps_tdee4_stv0297_config = {
|
||||
// .pll_set = alps_tdee4_stv0297_pll_set,
|
||||
};
|
||||
|
||||
|
||||
/* SkyStar2 rev2.7 (a/u) */
|
||||
static struct s5h1420_config skystar2_rev2_7_s5h1420_config = {
|
||||
.demod_address = 0x53,
|
||||
.invert = 1,
|
||||
.repeated_start_workaround = 1,
|
||||
};
|
||||
|
||||
static struct itd1000_config skystar2_rev2_7_itd1000_config = {
|
||||
.i2c_address = 0x61,
|
||||
};
|
||||
|
||||
/* SkyStar2 rev2.8 */
|
||||
static struct cx24123_config skystar2_rev2_8_cx24123_config = {
|
||||
.demod_address = 0x55,
|
||||
.dont_use_pll = 1,
|
||||
.agc_callback = cx24113_agc_callback,
|
||||
};
|
||||
|
||||
static const struct cx24113_config skystar2_rev2_8_cx24113_config = {
|
||||
.i2c_addr = 0x54,
|
||||
.xtal_khz = 10111,
|
||||
};
|
||||
|
||||
/* try to figure out the frontend, each card/box can have on of the following list */
|
||||
int flexcop_frontend_init(struct flexcop_device *fc)
|
||||
{
|
||||
struct dvb_frontend_ops *ops;
|
||||
struct i2c_adapter *i2c = &fc->fc_i2c_adap[0].i2c_adap;
|
||||
struct i2c_adapter *i2c_tuner;
|
||||
|
||||
/* enable no_base_addr - no repeated start when reading */
|
||||
fc->fc_i2c_adap[0].no_base_addr = 1;
|
||||
fc->fe = dvb_attach(s5h1420_attach, &skystar2_rev2_7_s5h1420_config, i2c);
|
||||
if (fc->fe != NULL) {
|
||||
flexcop_ibi_value r108;
|
||||
i2c_tuner = s5h1420_get_tuner_i2c_adapter(fc->fe);
|
||||
ops = &fc->fe->ops;
|
||||
|
||||
fc->fe_sleep = ops->sleep;
|
||||
ops->sleep = flexcop_sleep;
|
||||
|
||||
fc->dev_type = FC_SKY_REV27;
|
||||
|
||||
/* enable no_base_addr - no repeated start when reading */
|
||||
fc->fc_i2c_adap[2].no_base_addr = 1;
|
||||
if (dvb_attach(isl6421_attach, fc->fe, &fc->fc_i2c_adap[2].i2c_adap, 0x08, 1, 1) == NULL)
|
||||
err("ISL6421 could NOT be attached");
|
||||
else
|
||||
info("ISL6421 successfully attached");
|
||||
|
||||
/* the ITD1000 requires a lower i2c clock - it slows down the stuff for everyone - but is it a problem ? */
|
||||
r108.raw = 0x00000506;
|
||||
fc->write_ibi_reg(fc, tw_sm_c_108, r108);
|
||||
if (i2c_tuner) {
|
||||
if (dvb_attach(itd1000_attach, fc->fe, i2c_tuner, &skystar2_rev2_7_itd1000_config) == NULL)
|
||||
err("ITD1000 could NOT be attached");
|
||||
else
|
||||
info("ITD1000 successfully attached");
|
||||
}
|
||||
goto fe_found;
|
||||
}
|
||||
fc->fc_i2c_adap[0].no_base_addr = 0; /* for the next devices we need it again */
|
||||
|
||||
/* try the sky v2.8 (cx24123, isl6421) */
|
||||
fc->fe = dvb_attach(cx24123_attach,
|
||||
&skystar2_rev2_8_cx24123_config, i2c);
|
||||
if (fc->fe != NULL) {
|
||||
i2c_tuner = cx24123_get_tuner_i2c_adapter(fc->fe);
|
||||
if (i2c_tuner != NULL) {
|
||||
if (dvb_attach(cx24113_attach, fc->fe,
|
||||
&skystar2_rev2_8_cx24113_config,
|
||||
i2c_tuner) == NULL)
|
||||
err("CX24113 could NOT be attached");
|
||||
else
|
||||
info("CX24113 successfully attached");
|
||||
}
|
||||
|
||||
fc->dev_type = FC_SKY_REV28;
|
||||
|
||||
fc->fc_i2c_adap[2].no_base_addr = 1;
|
||||
if (dvb_attach(isl6421_attach, fc->fe,
|
||||
&fc->fc_i2c_adap[2].i2c_adap, 0x08, 0, 0) == NULL)
|
||||
err("ISL6421 could NOT be attached");
|
||||
else
|
||||
info("ISL6421 successfully attached");
|
||||
|
||||
/* TODO on i2c_adap[1] addr 0x11 (EEPROM) there seems to be an
|
||||
* IR-receiver (PIC16F818) - but the card has no input for
|
||||
* that ??? */
|
||||
|
||||
goto fe_found;
|
||||
}
|
||||
|
||||
/* try the sky v2.6 (stv0299/Samsung tbmu24112(sl1935)) */
|
||||
if ((fc->fe = dvb_attach(stv0299_attach, &samsung_tbmu24112_config, &fc->i2c_adap)) != NULL) {
|
||||
fc->fe = dvb_attach(stv0299_attach, &samsung_tbmu24112_config, i2c);
|
||||
if (fc->fe != NULL) {
|
||||
ops = &fc->fe->ops;
|
||||
|
||||
ops->tuner_ops.set_params = samsung_tbmu24112_tuner_set_params;
|
||||
|
||||
ops->set_voltage = flexcop_set_voltage;
|
||||
|
||||
fc->fe_sleep = ops->sleep;
|
||||
ops->sleep = flexcop_sleep;
|
||||
fc->fe_sleep = ops->sleep;
|
||||
ops->sleep = flexcop_sleep;
|
||||
|
||||
fc->dev_type = FC_SKY;
|
||||
goto fe_found;
|
||||
}
|
||||
|
||||
fc->dev_type = FC_SKY;
|
||||
info("found the stv0299 at i2c address: 0x%02x",samsung_tbmu24112_config.demod_address);
|
||||
} else
|
||||
/* try the air dvb-t (mt352/Samsung tdtc9251dh0(??)) */
|
||||
if ((fc->fe = dvb_attach(mt352_attach, &samsung_tdtc9251dh0_config, &fc->i2c_adap)) != NULL ) {
|
||||
fc->dev_type = FC_AIR_DVB;
|
||||
fc->fe = dvb_attach(mt352_attach, &samsung_tdtc9251dh0_config, i2c);
|
||||
if (fc->fe != NULL) {
|
||||
fc->dev_type = FC_AIR_DVB;
|
||||
fc->fe->ops.tuner_ops.calc_regs = samsung_tdtc9251dh0_calc_regs;
|
||||
info("found the mt352 at i2c address: 0x%02x",samsung_tdtc9251dh0_config.demod_address);
|
||||
} else
|
||||
goto fe_found;
|
||||
}
|
||||
|
||||
/* try the air atsc 2nd generation (nxt2002) */
|
||||
if ((fc->fe = dvb_attach(nxt200x_attach, &samsung_tbmv_config, &fc->i2c_adap)) != NULL) {
|
||||
fc->dev_type = FC_AIR_ATSC2;
|
||||
fc->fe = dvb_attach(nxt200x_attach, &samsung_tbmv_config, i2c);
|
||||
if (fc->fe != NULL) {
|
||||
fc->dev_type = FC_AIR_ATSC2;
|
||||
dvb_attach(dvb_pll_attach, fc->fe, 0x61, NULL, DVB_PLL_SAMSUNG_TBMV);
|
||||
info("found the nxt2002 at i2c address: 0x%02x",samsung_tbmv_config.demod_address);
|
||||
} else
|
||||
/* try the air atsc 3nd generation (lgdt3303) */
|
||||
if ((fc->fe = dvb_attach(lgdt330x_attach, &air2pc_atsc_hd5000_config, &fc->i2c_adap)) != NULL) {
|
||||
fc->dev_type = FC_AIR_ATSC3;
|
||||
dvb_attach(dvb_pll_attach, fc->fe, 0x61, &fc->i2c_adap, DVB_PLL_LG_TDVS_H06XF);
|
||||
info("found the lgdt3303 at i2c address: 0x%02x",air2pc_atsc_hd5000_config.demod_address);
|
||||
} else
|
||||
goto fe_found;
|
||||
}
|
||||
|
||||
fc->fe = dvb_attach(lgdt330x_attach, &air2pc_atsc_hd5000_config, i2c);
|
||||
if (fc->fe != NULL) {
|
||||
fc->dev_type = FC_AIR_ATSC3;
|
||||
dvb_attach(simple_tuner_attach, fc->fe, i2c, 0x61,
|
||||
TUNER_LG_TDVS_H06XF);
|
||||
goto fe_found;
|
||||
}
|
||||
|
||||
/* try the air atsc 1nd generation (bcm3510)/panasonic ct10s */
|
||||
if ((fc->fe = dvb_attach(bcm3510_attach, &air2pc_atsc_first_gen_config, &fc->i2c_adap)) != NULL) {
|
||||
fc->dev_type = FC_AIR_ATSC1;
|
||||
info("found the bcm3510 at i2c address: 0x%02x",air2pc_atsc_first_gen_config.demod_address);
|
||||
} else
|
||||
fc->fe = dvb_attach(bcm3510_attach, &air2pc_atsc_first_gen_config, i2c);
|
||||
if (fc->fe != NULL) {
|
||||
fc->dev_type = FC_AIR_ATSC1;
|
||||
goto fe_found;
|
||||
}
|
||||
|
||||
/* try the cable dvb (stv0297) */
|
||||
if ((fc->fe = dvb_attach(stv0297_attach, &alps_tdee4_stv0297_config, &fc->i2c_adap)) != NULL) {
|
||||
fc->dev_type = FC_CABLE;
|
||||
fc->fe = dvb_attach(stv0297_attach, &alps_tdee4_stv0297_config, i2c);
|
||||
if (fc->fe != NULL) {
|
||||
fc->dev_type = FC_CABLE;
|
||||
fc->fe->ops.tuner_ops.set_params = alps_tdee4_stv0297_tuner_set_params;
|
||||
info("found the stv0297 at i2c address: 0x%02x",alps_tdee4_stv0297_config.demod_address);
|
||||
} else
|
||||
goto fe_found;
|
||||
}
|
||||
|
||||
/* try the sky v2.3 (vp310/Samsung tbdu18132(tsa5059)) */
|
||||
if ((fc->fe = dvb_attach(vp310_mt312_attach, &skystar23_samsung_tbdu18132_config, &fc->i2c_adap)) != NULL) {
|
||||
fc->fe = dvb_attach(vp310_mt312_attach,
|
||||
&skystar23_samsung_tbdu18132_config, i2c);
|
||||
if (fc->fe != NULL) {
|
||||
ops = &fc->fe->ops;
|
||||
|
||||
ops->tuner_ops.set_params = skystar23_samsung_tbdu18132_tuner_set_params;
|
||||
@@ -535,19 +650,21 @@ int flexcop_frontend_init(struct flexcop_device *fc)
|
||||
ops->sleep = flexcop_sleep;
|
||||
|
||||
fc->dev_type = FC_SKY_OLD;
|
||||
info("found the vp310 (aka mt312) at i2c address: 0x%02x",skystar23_samsung_tbdu18132_config.demod_address);
|
||||
goto fe_found;
|
||||
}
|
||||
|
||||
if (fc->fe == NULL) {
|
||||
err("no frontend driver found for this B2C2/FlexCop adapter");
|
||||
return -ENODEV;
|
||||
} else {
|
||||
if (dvb_register_frontend(&fc->dvb_adapter, fc->fe)) {
|
||||
err("frontend registration failed!");
|
||||
dvb_frontend_detach(fc->fe);
|
||||
fc->fe = NULL;
|
||||
return -EINVAL;
|
||||
}
|
||||
err("no frontend driver found for this B2C2/FlexCop adapter");
|
||||
return -ENODEV;
|
||||
|
||||
fe_found:
|
||||
info("found '%s' .", fc->fe->ops.info.name);
|
||||
if (dvb_register_frontend(&fc->dvb_adapter, fc->fe)) {
|
||||
err("frontend registration failed!");
|
||||
ops = &fc->fe->ops;
|
||||
if (ops->release != NULL)
|
||||
ops->release(fc->fe);
|
||||
fc->fe = NULL;
|
||||
return -EINVAL;
|
||||
}
|
||||
fc->init_state |= FC_STATE_FE_INIT;
|
||||
return 0;
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
#define FC_MAX_I2C_RETRIES 100000
|
||||
|
||||
/* #define DUMP_I2C_MESSAGES */
|
||||
|
||||
static int flexcop_i2c_operation(struct flexcop_device *fc, flexcop_ibi_value *r100)
|
||||
{
|
||||
int i;
|
||||
@@ -38,30 +40,25 @@ static int flexcop_i2c_operation(struct flexcop_device *fc, flexcop_ibi_value *r
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
|
||||
static int flexcop_i2c_read4(struct flexcop_device *fc, flexcop_ibi_value r100, u8 *buf)
|
||||
static int flexcop_i2c_read4(struct flexcop_i2c_adapter *i2c,
|
||||
flexcop_ibi_value r100, u8 *buf)
|
||||
{
|
||||
flexcop_ibi_value r104;
|
||||
int len = r100.tw_sm_c_100.total_bytes, /* remember total_bytes is buflen-1 */
|
||||
ret;
|
||||
|
||||
if ((ret = flexcop_i2c_operation(fc,&r100)) != 0) {
|
||||
/* The Cablestar needs a different kind of i2c-transfer (does not
|
||||
* support "Repeat Start"):
|
||||
* wait for the ACK failure,
|
||||
* and do a subsequent read with the Bit 30 enabled
|
||||
*/
|
||||
r100.tw_sm_c_100.no_base_addr_ack_error = 1;
|
||||
if ((ret = flexcop_i2c_operation(fc,&r100)) != 0) {
|
||||
deb_i2c("no_base_addr read failed. %d\n",ret);
|
||||
return ret;
|
||||
}
|
||||
r100.tw_sm_c_100.no_base_addr_ack_error = i2c->no_base_addr;
|
||||
ret = flexcop_i2c_operation(i2c->fc, &r100);
|
||||
if (ret != 0) {
|
||||
deb_i2c("read failed. %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
buf[0] = r100.tw_sm_c_100.data1_reg;
|
||||
|
||||
if (len > 0) {
|
||||
r104 = fc->read_ibi_reg(fc,tw_sm_c_104);
|
||||
deb_i2c("read: r100: %08x, r104: %08x\n",r100.raw,r104.raw);
|
||||
r104 = i2c->fc->read_ibi_reg(i2c->fc, tw_sm_c_104);
|
||||
deb_i2c("read: r100: %08x, r104: %08x\n", r100.raw, r104.raw);
|
||||
|
||||
/* there is at least one more byte, otherwise we wouldn't be here */
|
||||
buf[1] = r104.tw_sm_c_104.data2_reg;
|
||||
@@ -85,17 +82,22 @@ static int flexcop_i2c_write4(struct flexcop_device *fc, flexcop_ibi_value r100,
|
||||
r104.tw_sm_c_104.data3_reg = len > 1 ? buf[2] : 0;
|
||||
r104.tw_sm_c_104.data4_reg = len > 2 ? buf[3] : 0;
|
||||
|
||||
deb_i2c("write: r100: %08x, r104: %08x\n",r100.raw,r104.raw);
|
||||
deb_i2c("write: r100: %08x, r104: %08x\n", r100.raw, r104.raw);
|
||||
|
||||
/* write the additional i2c data before doing the actual i2c operation */
|
||||
fc->write_ibi_reg(fc,tw_sm_c_104,r104);
|
||||
return flexcop_i2c_operation(fc,&r100);
|
||||
fc->write_ibi_reg(fc, tw_sm_c_104, r104);
|
||||
return flexcop_i2c_operation(fc, &r100);
|
||||
}
|
||||
|
||||
int flexcop_i2c_request(struct flexcop_device *fc, flexcop_access_op_t op,
|
||||
flexcop_i2c_port_t port, u8 chipaddr, u8 addr, u8 *buf, u16 len)
|
||||
int flexcop_i2c_request(struct flexcop_i2c_adapter *i2c,
|
||||
flexcop_access_op_t op, u8 chipaddr, u8 addr, u8 *buf, u16 len)
|
||||
{
|
||||
int ret;
|
||||
|
||||
#ifdef DUMP_I2C_MESSAGES
|
||||
int i;
|
||||
#endif
|
||||
|
||||
u16 bytes_to_transfer;
|
||||
flexcop_ibi_value r100;
|
||||
|
||||
@@ -103,7 +105,25 @@ int flexcop_i2c_request(struct flexcop_device *fc, flexcop_access_op_t op,
|
||||
r100.raw = 0;
|
||||
r100.tw_sm_c_100.chipaddr = chipaddr;
|
||||
r100.tw_sm_c_100.twoWS_rw = op;
|
||||
r100.tw_sm_c_100.twoWS_port_reg = port;
|
||||
r100.tw_sm_c_100.twoWS_port_reg = i2c->port;
|
||||
|
||||
#ifdef DUMP_I2C_MESSAGES
|
||||
printk(KERN_DEBUG "%d ", i2c->port);
|
||||
if (op == FC_READ)
|
||||
printk("rd(");
|
||||
else
|
||||
printk("wr(");
|
||||
|
||||
printk("%02x): %02x ", chipaddr, addr);
|
||||
#endif
|
||||
|
||||
/* in that case addr is the only value ->
|
||||
* we write it twice as baseaddr and val0
|
||||
* BBTI is doing it like that for ISL6421 at least */
|
||||
if (i2c->no_base_addr && len == 0 && op == FC_WRITE) {
|
||||
buf = &addr;
|
||||
len = 1;
|
||||
}
|
||||
|
||||
while (len != 0) {
|
||||
bytes_to_transfer = len > 4 ? 4 : len;
|
||||
@@ -112,9 +132,14 @@ int flexcop_i2c_request(struct flexcop_device *fc, flexcop_access_op_t op,
|
||||
r100.tw_sm_c_100.baseaddr = addr;
|
||||
|
||||
if (op == FC_READ)
|
||||
ret = flexcop_i2c_read4(fc, r100, buf);
|
||||
ret = flexcop_i2c_read4(i2c, r100, buf);
|
||||
else
|
||||
ret = flexcop_i2c_write4(fc,r100, buf);
|
||||
ret = flexcop_i2c_write4(i2c->fc, r100, buf);
|
||||
|
||||
#ifdef DUMP_I2C_MESSAGES
|
||||
for (i = 0; i < bytes_to_transfer; i++)
|
||||
printk("%02x ", buf[i]);
|
||||
#endif
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@@ -122,7 +147,11 @@ int flexcop_i2c_request(struct flexcop_device *fc, flexcop_access_op_t op,
|
||||
buf += bytes_to_transfer;
|
||||
addr += bytes_to_transfer;
|
||||
len -= bytes_to_transfer;
|
||||
};
|
||||
}
|
||||
|
||||
#ifdef DUMP_I2C_MESSAGES
|
||||
printk("\n");
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -132,7 +161,7 @@ EXPORT_SYMBOL(flexcop_i2c_request);
|
||||
/* master xfer callback for demodulator */
|
||||
static int flexcop_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num)
|
||||
{
|
||||
struct flexcop_device *fc = i2c_get_adapdata(i2c_adap);
|
||||
struct flexcop_i2c_adapter *i2c = i2c_get_adapdata(i2c_adap);
|
||||
int i, ret = 0;
|
||||
|
||||
/* Some drivers use 1 byte or 0 byte reads as probes, which this
|
||||
@@ -142,34 +171,29 @@ static int flexcop_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs
|
||||
if (num == 1 && msgs[0].flags == I2C_M_RD && msgs[0].len <= 1)
|
||||
return 1;
|
||||
|
||||
if (mutex_lock_interruptible(&fc->i2c_mutex))
|
||||
if (mutex_lock_interruptible(&i2c->fc->i2c_mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
/* reading */
|
||||
if (num == 2 &&
|
||||
msgs[0].flags == 0 &&
|
||||
msgs[1].flags == I2C_M_RD &&
|
||||
msgs[0].buf != NULL &&
|
||||
msgs[1].buf != NULL) {
|
||||
|
||||
ret = fc->i2c_request(fc, FC_READ, FC_I2C_PORT_DEMOD, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
|
||||
|
||||
} else for (i = 0; i < num; i++) { /* writing command */
|
||||
if (msgs[i].flags != 0 || msgs[i].buf == NULL || msgs[i].len < 2) {
|
||||
ret = -EINVAL;
|
||||
for (i = 0; i < num; i++) {
|
||||
/* reading */
|
||||
if (i+1 < num && (msgs[i+1].flags == I2C_M_RD)) {
|
||||
ret = i2c->fc->i2c_request(i2c, FC_READ, msgs[i].addr,
|
||||
msgs[i].buf[0], msgs[i+1].buf, msgs[i+1].len);
|
||||
i++; /* skip the following message */
|
||||
} else /* writing */
|
||||
ret = i2c->fc->i2c_request(i2c, FC_WRITE, msgs[i].addr,
|
||||
msgs[i].buf[0], &msgs[i].buf[1],
|
||||
msgs[i].len - 1);
|
||||
if (ret < 0) {
|
||||
err("i2c master_xfer failed");
|
||||
break;
|
||||
}
|
||||
|
||||
ret = fc->i2c_request(fc, FC_WRITE, FC_I2C_PORT_DEMOD, msgs[i].addr, msgs[i].buf[0], &msgs[i].buf[1], msgs[i].len - 1);
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
err("i2c master_xfer failed");
|
||||
else
|
||||
mutex_unlock(&i2c->fc->i2c_mutex);
|
||||
|
||||
if (ret == 0)
|
||||
ret = num;
|
||||
|
||||
mutex_unlock(&fc->i2c_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -189,28 +213,68 @@ int flexcop_i2c_init(struct flexcop_device *fc)
|
||||
|
||||
mutex_init(&fc->i2c_mutex);
|
||||
|
||||
memset(&fc->i2c_adap, 0, sizeof(struct i2c_adapter));
|
||||
strncpy(fc->i2c_adap.name, "B2C2 FlexCop device",
|
||||
sizeof(fc->i2c_adap.name));
|
||||
fc->fc_i2c_adap[0].fc = fc;
|
||||
fc->fc_i2c_adap[1].fc = fc;
|
||||
fc->fc_i2c_adap[2].fc = fc;
|
||||
|
||||
i2c_set_adapdata(&fc->i2c_adap,fc);
|
||||
fc->fc_i2c_adap[0].port = FC_I2C_PORT_DEMOD;
|
||||
fc->fc_i2c_adap[1].port = FC_I2C_PORT_EEPROM;
|
||||
fc->fc_i2c_adap[2].port = FC_I2C_PORT_TUNER;
|
||||
|
||||
fc->i2c_adap.class = I2C_CLASS_TV_DIGITAL;
|
||||
fc->i2c_adap.algo = &flexcop_algo;
|
||||
fc->i2c_adap.algo_data = NULL;
|
||||
fc->i2c_adap.dev.parent = fc->dev;
|
||||
strncpy(fc->fc_i2c_adap[0].i2c_adap.name,
|
||||
"B2C2 FlexCop I2C to demod", I2C_NAME_SIZE);
|
||||
strncpy(fc->fc_i2c_adap[1].i2c_adap.name,
|
||||
"B2C2 FlexCop I2C to eeprom", I2C_NAME_SIZE);
|
||||
strncpy(fc->fc_i2c_adap[2].i2c_adap.name,
|
||||
"B2C2 FlexCop I2C to tuner", I2C_NAME_SIZE);
|
||||
|
||||
if ((ret = i2c_add_adapter(&fc->i2c_adap)) < 0)
|
||||
i2c_set_adapdata(&fc->fc_i2c_adap[0].i2c_adap, &fc->fc_i2c_adap[0]);
|
||||
i2c_set_adapdata(&fc->fc_i2c_adap[1].i2c_adap, &fc->fc_i2c_adap[1]);
|
||||
i2c_set_adapdata(&fc->fc_i2c_adap[2].i2c_adap, &fc->fc_i2c_adap[2]);
|
||||
|
||||
fc->fc_i2c_adap[0].i2c_adap.class =
|
||||
fc->fc_i2c_adap[1].i2c_adap.class =
|
||||
fc->fc_i2c_adap[2].i2c_adap.class = I2C_CLASS_TV_DIGITAL;
|
||||
fc->fc_i2c_adap[0].i2c_adap.algo =
|
||||
fc->fc_i2c_adap[1].i2c_adap.algo =
|
||||
fc->fc_i2c_adap[2].i2c_adap.algo = &flexcop_algo;
|
||||
fc->fc_i2c_adap[0].i2c_adap.algo_data =
|
||||
fc->fc_i2c_adap[1].i2c_adap.algo_data =
|
||||
fc->fc_i2c_adap[2].i2c_adap.algo_data = NULL;
|
||||
fc->fc_i2c_adap[0].i2c_adap.dev.parent =
|
||||
fc->fc_i2c_adap[1].i2c_adap.dev.parent =
|
||||
fc->fc_i2c_adap[2].i2c_adap.dev.parent = fc->dev;
|
||||
|
||||
ret = i2c_add_adapter(&fc->fc_i2c_adap[0].i2c_adap);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = i2c_add_adapter(&fc->fc_i2c_adap[1].i2c_adap);
|
||||
if (ret < 0)
|
||||
goto adap_1_failed;
|
||||
|
||||
ret = i2c_add_adapter(&fc->fc_i2c_adap[2].i2c_adap);
|
||||
if (ret < 0)
|
||||
goto adap_2_failed;
|
||||
|
||||
fc->init_state |= FC_STATE_I2C_INIT;
|
||||
return 0;
|
||||
|
||||
adap_2_failed:
|
||||
i2c_del_adapter(&fc->fc_i2c_adap[1].i2c_adap);
|
||||
adap_1_failed:
|
||||
i2c_del_adapter(&fc->fc_i2c_adap[0].i2c_adap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void flexcop_i2c_exit(struct flexcop_device *fc)
|
||||
{
|
||||
if (fc->init_state & FC_STATE_I2C_INIT)
|
||||
i2c_del_adapter(&fc->i2c_adap);
|
||||
if (fc->init_state & FC_STATE_I2C_INIT) {
|
||||
i2c_del_adapter(&fc->fc_i2c_adap[2].i2c_adap);
|
||||
i2c_del_adapter(&fc->fc_i2c_adap[1].i2c_adap);
|
||||
i2c_del_adapter(&fc->fc_i2c_adap[0].i2c_adap);
|
||||
}
|
||||
|
||||
fc->init_state &= ~FC_STATE_I2C_INIT;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user