diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-23 21:12:49 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-23 21:12:49 -0700 |
commit | df462b3dbeeaae7141f1b63cbfcc1e1bae6a85fc (patch) | |
tree | bca52fce066159f136d75c69e79016422212cb1d /drivers/staging | |
parent | 343800e7d20944aead238c2c6e3f7789f8b6587c (diff) | |
parent | cf25220677b3f10468a74278130fe224f73632a6 (diff) |
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (247 commits)
[media] gspca - sunplus: Fix some warnings and simplify code
[media] gspca: Fix some warnings tied to 'no debug'
[media] gspca: Unset debug by default
[media] gspca - cpia1: Remove a bad conditional compilation instruction
[media] gspca - main: Remove USB traces
[media] gspca - main: Version change to 2.13
[media] gspca - stk014 / t613: Accept the index 0 in querymenu
[media] gspca - kinect: Remove __devinitdata
[media] gspca - cpia1: Fix some warnings
[media] video/Kconfig: Fix mis-classified devices
[media] support for medion dvb stick 1660:1921
[media] tm6000: fix uninitialized field, change prink to dprintk
[media] cx231xx: Add support for Iconbit U100
[media] saa7134 add new TV cards
[media] Use a more consistent value for RC repeat period
[media] cx18: Move spinlock and vb_type initialisation into stream_init
[media] tm6000: remove tm6010 sif audio start and stop
[media] tm6000: remove unused exports
[media] tm6000: add pts logging
[media] tm6000: change from ioctl to unlocked_ioctl
...
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/lirc/lirc_sasem.c | 13 | ||||
-rw-r--r-- | drivers/staging/tm6000/CARDLIST | 16 | ||||
-rw-r--r-- | drivers/staging/tm6000/tm6000-alsa.c | 3 | ||||
-rw-r--r-- | drivers/staging/tm6000/tm6000-cards.c | 381 | ||||
-rw-r--r-- | drivers/staging/tm6000/tm6000-core.c | 109 | ||||
-rw-r--r-- | drivers/staging/tm6000/tm6000-i2c.c | 33 | ||||
-rw-r--r-- | drivers/staging/tm6000/tm6000-stds.c | 923 | ||||
-rw-r--r-- | drivers/staging/tm6000/tm6000-usb-isoc.h | 2 | ||||
-rw-r--r-- | drivers/staging/tm6000/tm6000-video.c | 212 | ||||
-rw-r--r-- | drivers/staging/tm6000/tm6000.h | 46 |
10 files changed, 781 insertions, 957 deletions
diff --git a/drivers/staging/lirc/lirc_sasem.c b/drivers/staging/lirc/lirc_sasem.c index 63a438d1c849..7080cdeab5a6 100644 --- a/drivers/staging/lirc/lirc_sasem.c +++ b/drivers/staging/lirc/lirc_sasem.c @@ -570,6 +570,7 @@ static void incoming_packet(struct sasem_context *context, unsigned char *buf = urb->transfer_buffer; long ms; struct timeval tv; + int i; if (len != 8) { printk(KERN_WARNING "%s: invalid incoming packet size (%d)\n", @@ -577,12 +578,12 @@ static void incoming_packet(struct sasem_context *context, return; } -#ifdef DEBUG - int i; - for (i = 0; i < 8; ++i) - printk(KERN_INFO "%02x ", buf[i]); - printk(KERN_INFO "\n"); -#endif + if (debug) { + printk(KERN_INFO "Incoming data: "); + for (i = 0; i < 8; ++i) + printk(KERN_CONT "%02x ", buf[i]); + printk(KERN_CONT "\n"); + } /* * Lirc could deal with the repeat code, but we really need to block it diff --git a/drivers/staging/tm6000/CARDLIST b/drivers/staging/tm6000/CARDLIST new file mode 100644 index 000000000000..b5edce487997 --- /dev/null +++ b/drivers/staging/tm6000/CARDLIST @@ -0,0 +1,16 @@ + 1 -> Generic tm5600 board (tm5600) [6000:0001] + 2 -> Generic tm6000 board (tm6000) [6000:0001] + 3 -> Generic tm6010 board (tm6010) [6000:0002] + 4 -> 10Moons UT821 (tm5600) [6000:0001] + 5 -> 10Moons UT330 (tm5600) + 6 -> ADSTech Dual TV (tm6000) [06e1:f332] + 7 -> FreeCom and similar (tm6000) [14aa:0620] + 8 -> ADSTech Mini Dual TV (tm6000) [06e1:b339] + 9 -> Hauppauge WinTV HVR-900H/USB2 Stick (tm6010) [2040:6600,2040:6601,2040:6610,2040:6611] + 10 -> Beholder Wander (tm6010) [6000:dec0] + 11 -> Beholder Voyager (tm6010) [6000:dec1] + 12 -> TerraTec Cinergy Hybrid XE/Cinergy Hybrid Stick (tm6010) [0ccd:0086,0ccd:00a5] + 13 -> TwinHan TU501 (tm6010) [13d3:3240,13d3:3241,13d3:3243,13d3:3264] + 14 -> Beholder Wander Lite (tm6010) [6000:dec2] + 15 -> Beholder Voyager Lite (tm6010) [6000:dec3] + diff --git a/drivers/staging/tm6000/tm6000-alsa.c b/drivers/staging/tm6000/tm6000-alsa.c index acb03172a887..2b96047c2983 100644 --- a/drivers/staging/tm6000/tm6000-alsa.c +++ b/drivers/staging/tm6000/tm6000-alsa.c @@ -84,7 +84,6 @@ static int _tm6000_start_audio_dma(struct snd_tm6000_card *chip) tm6000_set_audio_bitrate(core, 48000); - tm6000_set_reg(core, TM6010_REQ08_R01_A_INIT, 0x80); return 0; } @@ -101,8 +100,6 @@ static int _tm6000_stop_audio_dma(struct snd_tm6000_card *chip) /* Disables audio */ tm6000_set_reg_mask(core, TM6010_REQ07_RCC_ACTIVE_VIDEO_IF, 0x00, 0x40); - tm6000_set_reg(core, TM6010_REQ08_R01_A_INIT, 0); - return 0; } diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c index 146c7e86deca..a69c82e11991 100644 --- a/drivers/staging/tm6000/tm6000-cards.c +++ b/drivers/staging/tm6000/tm6000-cards.c @@ -54,6 +54,11 @@ #define TM6010_BOARD_BEHOLD_VOYAGER_LITE 15 #define TM5600_BOARD_TERRATEC_GRABSTER 16 +#define is_generic(model) ((model == TM6000_BOARD_UNKNOWN) || \ + (model == TM5600_BOARD_GENERIC) || \ + (model == TM6000_BOARD_GENERIC) || \ + (model == TM6010_BOARD_GENERIC)) + #define TM6000_MAXBOARDS 16 static unsigned int card[] = {[0 ... (TM6000_MAXBOARDS - 1)] = UNSET }; @@ -64,10 +69,11 @@ static unsigned long tm6000_devused; struct tm6000_board { char *name; + char eename[16]; /* EEPROM name */ + unsigned eename_size; /* size of EEPROM name */ + unsigned eename_pos; /* Position where it appears at ROM */ struct tm6000_capabilities caps; - enum tm6000_inaudio aradio; - enum tm6000_inaudio avideo; enum tm6000_devtype type; /* variant of the chipset */ int tuner_type; /* type of the tuner */ @@ -76,6 +82,9 @@ struct tm6000_board { struct tm6000_gpio gpio; + struct tm6000_input vinput[3]; + struct tm6000_input rinput; + char *ir_codes; }; @@ -83,11 +92,26 @@ struct tm6000_board tm6000_boards[] = { [TM6000_BOARD_UNKNOWN] = { .name = "Unknown tm6000 video grabber", .caps = { - .has_tuner = 1, + .has_tuner = 1, + .has_eeprom = 1, }, .gpio = { .tuner_reset = TM6000_GPIO_1, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_ADC1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM5600_BOARD_GENERIC] = { .name = "Generic tm5600 board", @@ -96,10 +120,25 @@ struct tm6000_board tm6000_boards[] = { .tuner_addr = 0xc2 >> 1, .caps = { .has_tuner = 1, + .has_eeprom = 1, }, .gpio = { .tuner_reset = TM6000_GPIO_1, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_ADC1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM6000_BOARD_GENERIC] = { .name = "Generic tm6000 board", @@ -107,11 +146,25 @@ struct tm6000_board tm6000_boards[] = { .tuner_addr = 0xc2 >> 1, .caps = { .has_tuner = 1, - .has_dvb = 1, + .has_eeprom = 1, }, .gpio = { .tuner_reset = TM6000_GPIO_1, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_ADC1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM6010_BOARD_GENERIC] = { .name = "Generic tm6010 board", @@ -135,10 +188,27 @@ struct tm6000_board tm6000_boards[] = { .dvb_led = TM6010_GPIO_5, .ir = TM6010_GPIO_0, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_SIF1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM5600_BOARD_10MOONS_UT821] = { .name = "10Moons UT 821", .tuner_type = TUNER_XC2028, + .eename = { '1', '0', 'M', 'O', 'O', 'N', 'S', '5', '6', '0', '0', 0xff, 0x45, 0x5b}, + .eename_size = 14, + .eename_pos = 0x14, .type = TM5600, .tuner_addr = 0xc2 >> 1, .caps = { @@ -148,6 +218,20 @@ struct tm6000_board tm6000_boards[] = { .gpio = { .tuner_reset = TM6000_GPIO_1, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_ADC1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM5600_BOARD_10MOONS_UT330] = { .name = "10Moons UT 330", @@ -159,6 +243,20 @@ struct tm6000_board tm6000_boards[] = { .has_zl10353 = 0, .has_eeprom = 1, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_ADC1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM6000_BOARD_ADSTECH_DUAL_TV] = { .name = "ADSTECH Dual TV USB", @@ -171,6 +269,20 @@ struct tm6000_board tm6000_boards[] = { .has_zl10353 = 1, .has_eeprom = 1, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_ADC1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM6000_BOARD_FREECOM_AND_SIMILAR] = { .name = "Freecom Hybrid Stick / Moka DVB-T Receiver Dual", @@ -187,6 +299,20 @@ struct tm6000_board tm6000_boards[] = { .gpio = { .tuner_reset = TM6000_GPIO_4, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_ADC1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM6000_BOARD_ADSTECH_MINI_DUAL_TV] = { .name = "ADSTECH Mini Dual TV USB", @@ -202,9 +328,26 @@ struct tm6000_board tm6000_boards[] = { .gpio = { .tuner_reset = TM6000_GPIO_4, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_ADC1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM6010_BOARD_HAUPPAUGE_900H] = { .name = "Hauppauge WinTV HVR-900H / WinTV USB2-Stick", + .eename = { 'H', 0, 'V', 0, 'R', 0, '9', 0, '0', 0, '0', 0, 'H', 0 }, + .eename_size = 14, + .eename_pos = 0x42, .tuner_type = TUNER_XC2028, /* has a XC3028 */ .tuner_addr = 0xc2 >> 1, .demod_addr = 0x1e >> 1, @@ -225,6 +368,20 @@ struct tm6000_board tm6000_boards[] = { .dvb_led = TM6010_GPIO_5, .ir = TM6010_GPIO_0, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_SIF1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM6010_BOARD_BEHOLD_WANDER] = { .name = "Beholder Wander DVB-T/TV/FM USB2.0", @@ -232,43 +389,73 @@ struct tm6000_board tm6000_boards[] = { .tuner_addr = 0xc2 >> 1, .demod_addr = 0x1e >> 1, .type = TM6010, - .avideo = TM6000_AIP_SIF1, - .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 1, .has_zl10353 = 1, .has_eeprom = 1, .has_remote = 1, - .has_input_comp = 1, - .has_input_svid = 1, + .has_radio = 1. }, .gpio = { .tuner_reset = TM6010_GPIO_0, .demod_reset = TM6010_GPIO_1, .power_led = TM6010_GPIO_6, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_SIF1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, + .rinput = { + .type = TM6000_INPUT_RADIO, + .amux = TM6000_AMUX_ADC1, + }, }, [TM6010_BOARD_BEHOLD_VOYAGER] = { .name = "Beholder Voyager TV/FM USB2.0", .tuner_type = TUNER_XC5000, .tuner_addr = 0xc2 >> 1, .type = TM6010, - .avideo = TM6000_AIP_SIF1, - .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 0, .has_zl10353 = 0, .has_eeprom = 1, .has_remote = 1, - .has_input_comp = 1, - .has_input_svid = 1, + .has_radio = 1, }, .gpio = { .tuner_reset = TM6010_GPIO_0, .power_led = TM6010_GPIO_6, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_SIF1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, + .rinput = { + .type = TM6000_INPUT_RADIO, + .amux = TM6000_AMUX_ADC1, + }, }, [TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE] = { .name = "Terratec Cinergy Hybrid XE / Cinergy Hybrid-Stick", @@ -293,11 +480,39 @@ struct tm6000_board tm6000_boards[] = { .ir = TM6010_GPIO_0, }, .ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_SIF1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM5600_BOARD_TERRATEC_GRABSTER] = { .name = "Terratec Grabster AV 150/250 MX", .type = TM5600, .tuner_type = TUNER_ABSENT, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_ADC1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM6010_BOARD_TWINHAN_TU501] = { .name = "Twinhan TU501(704D1)", @@ -321,6 +536,20 @@ struct tm6000_board tm6000_boards[] = { .dvb_led = TM6010_GPIO_5, .ir = TM6010_GPIO_0, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_SIF1, + }, { + .type = TM6000_INPUT_COMPOSITE1, + .vmux = TM6000_VMUX_VIDEO_A, + .amux = TM6000_AMUX_ADC2, + }, { + .type = TM6000_INPUT_SVIDEO, + .vmux = TM6000_VMUX_VIDEO_AB, + .amux = TM6000_AMUX_ADC2, + }, + }, }, [TM6010_BOARD_BEHOLD_WANDER_LITE] = { .name = "Beholder Wander Lite DVB-T/TV/FM USB2.0", @@ -328,49 +557,63 @@ struct tm6000_board tm6000_boards[] = { .tuner_addr = 0xc2 >> 1, .demod_addr = 0x1e >> 1, .type = TM6010, - .avideo = TM6000_AIP_SIF1, - .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 1, .has_zl10353 = 1, .has_eeprom = 1, .has_remote = 0, - .has_input_comp = 0, - .has_input_svid = 0, + .has_radio = 1, }, .gpio = { .tuner_reset = TM6010_GPIO_0, .demod_reset = TM6010_GPIO_1, .power_led = TM6010_GPIO_6, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_SIF1, + }, + }, + .rinput = { + .type = TM6000_INPUT_RADIO, + .amux = TM6000_AMUX_ADC1, + }, }, [TM6010_BOARD_BEHOLD_VOYAGER_LITE] = { .name = "Beholder Voyager Lite TV/FM USB2.0", .tuner_type = TUNER_XC5000, .tuner_addr = 0xc2 >> 1, .type = TM6010, - .avideo = TM6000_AIP_SIF1, - .aradio = TM6000_AIP_LINE1, .caps = { .has_tuner = 1, .has_dvb = 0, .has_zl10353 = 0, .has_eeprom = 1, .has_remote = 0, - .has_input_comp = 0, - .has_input_svid = 0, + .has_radio = 1, }, .gpio = { .tuner_reset = TM6010_GPIO_0, .power_led = TM6010_GPIO_6, }, + .vinput = { { + .type = TM6000_INPUT_TV, + .vmux = TM6000_VMUX_VIDEO_B, + .amux = TM6000_AMUX_SIF1, + }, + }, + .rinput = { + .type = TM6000_INPUT_RADIO, + .amux = TM6000_AMUX_ADC1, + }, }, }; /* table of devices that work with this driver */ struct usb_device_id tm6000_id_table[] = { - { USB_DEVICE(0x6000, 0x0001), .driver_info = TM5600_BOARD_10MOONS_UT821 }, + { USB_DEVICE(0x6000, 0x0001), .driver_info = TM5600_BOARD_GENERIC }, { USB_DEVICE(0x6000, 0x0002), .driver_info = TM6010_BOARD_GENERIC }, { USB_DEVICE(0x06e1, 0xf332), .driver_info = TM6000_BOARD_ADSTECH_DUAL_TV }, { USB_DEVICE(0x14aa, 0x0620), .driver_info = TM6000_BOARD_FREECOM_AND_SIMILAR }, @@ -679,12 +922,8 @@ static void tm6000_config_tuner(struct tm6000_core *dev) memset(&xc2028_cfg, 0, sizeof(xc2028_cfg)); memset(&ctl, 0, sizeof(ctl)); - ctl.input1 = 1; - ctl.read_not_reliable = 0; - ctl.msleep = 10; ctl.demod = XC3028_FE_ZARLINK456; - ctl.vhfbw7 = 1; - ctl.uhfbw8 = 1; + xc2028_cfg.tuner = TUNER_XC2028; xc2028_cfg.priv = &ctl; @@ -729,16 +968,10 @@ static void tm6000_config_tuner(struct tm6000_core *dev) } } -static int tm6000_init_dev(struct tm6000_core *dev) +static int fill_board_specific_data(struct tm6000_core *dev) { - struct v4l2_frequency f; - int rc = 0; - - mutex_init(&dev->lock); - - mutex_lock(&dev->lock); + int rc; - /* Initializa board-specific data */ dev->dev_type = tm6000_boards[dev->model].type; dev->tuner_type = tm6000_boards[dev->model].tuner_type; dev->tuner_addr = tm6000_boards[dev->model].tuner_addr; @@ -751,21 +984,85 @@ static int tm6000_init_dev(struct tm6000_core *dev) dev->caps = tm6000_boards[dev->model].caps; - dev->avideo = tm6000_boards[dev->model].avideo; - dev->aradio = tm6000_boards[dev->model].aradio; + dev->vinput[0] = tm6000_boards[dev->model].vinput[0]; + dev->vinput[1] = tm6000_boards[dev->model].vinput[1]; + dev->vinput[2] = tm6000_boards[dev->model].vinput[2]; + dev->rinput = tm6000_boards[dev->model].rinput; + /* initialize hardware */ rc = tm6000_init(dev); if (rc < 0) - goto err; + return rc; rc = v4l2_device_register(&dev->udev->dev, &dev->v4l2_dev); if (rc < 0) - goto err; + return rc; - /* register i2c bus */ - rc = tm6000_i2c_register(dev); - if (rc < 0) - goto err; + return rc; +} + + +static void use_alternative_detection_method(struct tm6000_core *dev) +{ + int i, model = -1; + + if (!dev->eedata_size) + return; + + for (i = 0; i < ARRAY_SIZE(tm6000_boards); i++) { + if (!tm6000_boards[i].eename_size) + continue; + if (dev->eedata_size < tm6000_boards[i].eename_pos + + tm6000_boards[i].eename_size) + continue; + + if (!memcmp(&dev->eedata[tm6000_boards[i].eename_pos], + tm6000_boards[i].eename, + tm6000_boards[i].eename_size)) { + model = i; + break; + } + } + if (model < 0) { + printk(KERN_INFO "Device has eeprom but is currently unknown\n"); + return; + } + + dev->model = model; + + printk(KERN_INFO "Device identified via eeprom as %s (type = %d)\n", + tm6000_boards[model].name, model); +} + +static int tm6000_init_dev(struct tm6000_core *dev) +{ + struct v4l2_frequency f; + int rc = 0; + + mutex_init(&dev->lock); + mutex_lock(&dev->lock); + + if (!is_generic(dev->model)) { + rc = fill_board_specific_data(dev); + if (rc < 0) + goto err; + + /* register i2c bus */ + rc = tm6000_i2c_register(dev); + if (rc < 0) + goto err; + } else { + /* register i2c bus */ + rc = tm6000_i2c_register(dev); + if (rc < 0) + goto err; + + use_alternative_detection_method(dev); + + rc = fill_board_specific_data(dev); + if (rc < 0) + goto err; + } /* Default values for STD and resolutions */ dev->width = 720; diff --git a/drivers/staging/tm6000/tm6000-core.c b/drivers/staging/tm6000/tm6000-core.c index 778e53413afb..d7eb2e23cdbd 100644 --- a/drivers/staging/tm6000/tm6000-core.c +++ b/drivers/staging/tm6000/tm6000-core.c @@ -268,19 +268,18 @@ int tm6000_init_analog_mode(struct tm6000_core *dev) struct v4l2_frequency f; if (dev->dev_type == TM6010) { - /* Enable video */ - + /* Enable video and audio */ tm6000_set_reg_mask(dev, TM6010_REQ07_RCC_ACTIVE_VIDEO_IF, 0x60, 0x60); + /* Disable TS input */ tm6000_set_reg_mask(dev, TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE, 0x00, 0x40); - tm6000_set_reg(dev, TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc); - } else { /* Enables soft reset */ tm6000_set_reg(dev, TM6010_REQ07_R3F_RESET, 0x01); if (dev->scaler) + /* Disable Hfilter and Enable TS Drop err */ tm6000_set_reg(dev, TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE, 0x20); else /* Enable Hfilter and disable TS Drop err */ tm6000_set_reg(dev, TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE, 0x80); @@ -300,14 +299,6 @@ int tm6000_init_analog_mode(struct tm6000_core *dev) /* Disables soft reset */ tm6000_set_reg(dev, TM6010_REQ07_R3F_RESET, 0x00); - - /* E3: Select input 0 - TV tuner */ - tm6000_set_reg(dev, TM6000_REQ07_RE3_VADC_INP_LPF_SEL1, 0x00); - tm6000_set_reg(dev, TM6000_REQ07_REB_VADC_AADC_MODE, 0x60); - - /* This controls input */ - tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_2, 0x0); - tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_3, 0x01); } msleep(20); @@ -327,7 +318,7 @@ int tm6000_init_analog_mode(struct tm6000_core *dev) v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f); msleep(100); - tm6000_set_standard(dev, &dev->norm); + tm6000_set_standard(dev); tm6000_set_vbi(dev); tm6000_set_audio_bitrate(dev, 48000); @@ -343,21 +334,16 @@ int tm6000_init_analog_mode(struct tm6000_core *dev) int tm6000_init_digital_mode(struct tm6000_core *dev) { if (dev->dev_type == TM6010) { - int val; - u8 buf[2]; - - /* digital init */ - val = tm6000_get_reg(dev, TM6010_REQ07_RCC_ACTIVE_VIDEO_IF, 0); - val &= ~0x60; - tm6000_set_reg(dev, TM6010_REQ07_RCC_ACTIVE_VIDEO_IF, val); - val = tm6000_get_reg(dev, TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE, 0); - val |= 0x40; - tm6000_set_reg(dev, TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE, val); + /* Disable video and audio */ + tm6000_set_reg_mask(dev, TM6010_REQ07_RCC_ACTIVE_VIDEO_IF, + 0x00, 0x60); + /* Enable TS input */ + tm6000_set_reg_mask(dev, TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE, + 0x40, 0x40); + /* all power down, but not the digital data port */ tm6000_set_reg(dev, TM6010_REQ07_RFE_POWER_DOWN, 0x28); tm6000_set_reg(dev, TM6010_REQ08_RE2_POWER_DOWN_CTRL1, 0xfc); tm6000_set_reg(dev, TM6010_REQ08_RE6_POWER_DOWN_CTRL2, 0xff); - tm6000_read_write_usb(dev, 0xc0, 0x0e, 0x00c2, 0x0008, buf, 2); - printk(KERN_INFO"buf %#x %#x\n", buf[0], buf[1]); } else { tm6000_set_reg(dev, TM6010_REQ07_RFF_SOFT_RESET, 0x08); tm6000_set_reg(dev, TM6010_REQ07_RFF_SOFT_RESET, 0x00); @@ -489,14 +475,6 @@ struct reg_init tm6010_init_tab[] = { { TM6010_REQ08_REB_SIF_GAIN_CTRL, 0xf0 }, { TM6010_REQ08_REC_REVERSE_YC_CTRL, 0xc2 }, { TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, 0x60 }, - { TM6010_REQ08_R03_A_AUTO_GAIN_CTRL, 0x00}, - { TM6010_REQ08_R04_A_SIF_AMP_CTRL, 0x80}, - { TM6010_REQ08_R0C_A_ASD_THRES2, 0x0a}, - { TM6010_REQ08_R0D_A_AMD_THRES, 0x40}, - { TM6010_REQ08_R1A_A_NICAM_SER_MAX, 0x64}, - { TM6010_REQ08_R1B_A_NICAM_SER_MIN, 0x20}, - { TM6010_REQ08_R16_A_AGC_GAIN_MAX, 0xfe}, - { TM6010_REQ08_R17_A_AGC_GAIN_MIN, 0x01}, { TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc }, { TM6010_REQ07_R3F_RESET, 0x01 }, @@ -657,24 +635,29 @@ int tm6000_set_audio_bitrate(struct tm6000_core *dev, int bitrate) } EXPORT_SYMBOL_GPL(tm6000_set_audio_bitrate); -int tm6000_set_audio_input(struct tm6000_core *dev, enum tm6000_inaudio ainp) +int tm6000_set_audio_rinput(struct tm6000_core *dev) { if (dev->dev_type == TM6010) { /* Audio crossbar setting, default SIF1 */ - u8 areg_f0 = 0x03; + u8 areg_f0; - switch (ainp) { - case TM6000_AIP_SIF1: - case TM6000_AIP_SIF2: + switch (dev->rinput.amux) { + case TM6000_AMUX_SIF1: + case TM6000_AMUX_SIF2: areg_f0 = 0x03; break; - case TM6000_AIP_LINE1: + case TM6000_AMUX_ADC1: areg_f0 = 0x00; break; - case TM6000_AIP_LINE2: + case TM6000_AMUX_ADC2: areg_f0 = 0x08; break; + case TM6000_AMUX_I2S: + areg_f0 = 0x04; + break; default: + printk(KERN_INFO "%s: audio input dosn't support\n", + dev->name); return 0; break; } @@ -682,17 +665,18 @@ int tm6000_set_audio_input(struct tm6000_core *dev, enum tm6000_inaudio ainp) tm6000_set_reg_mask(dev, TM6010_REQ08_RF0_DAUDIO_INPUT_CONFIG, areg_f0, 0x0f); } else { + u8 areg_eb; /* Audio setting, default LINE1 */ - u8 areg_eb = 0x00; - - switch (ainp) { - case TM6000_AIP_LINE1: + switch (dev->rinput.amux) { + case TM6000_AMUX_ADC1: areg_eb = 0x00; break; - case TM6000_AIP_LINE2: + case TM6000_AMUX_ADC2: areg_eb = 0x04; break; default: + printk(KERN_INFO "%s: audio input dosn't support\n", + dev->name); return 0; break; } @@ -702,7 +686,6 @@ int tm6000_set_audio_input(struct tm6000_core *dev, enum tm6000_inaudio ainp) } return 0; } -EXPORT_SYMBOL_GPL(tm6000_set_audio_input); void tm6010_set_mute_sif(struct tm6000_core *dev, u8 mute) { @@ -736,16 +719,16 @@ void tm6010_set_mute_adc(struct tm6000_core *dev, u8 mute) int tm6000_tvaudio_set_mute(struct tm6000_core *dev, u8 mute) { - enum tm6000_inaudio ainp; + enum tm6000_mux mux; if (dev->radio) - ainp = dev->aradio; + mux = dev->rinput.amux; else - ainp = dev->avideo; + mux = dev->vinput[dev->input].amux; - switch (ainp) { - case TM6000_AIP_SIF1: - case TM6000_AIP_SIF2: + switch (mux) { + case TM6000_AMUX_SIF1: + case TM6000_AMUX_SIF2: if (dev->dev_type == TM6010) tm6010_set_mute_sif(dev, mute); else { @@ -755,8 +738,8 @@ int tm6000_tvaudio_set_mute(struct tm6000_core *dev, u8 mute) return -EINVAL; } break; - case TM6000_AIP_LINE1: - case TM6000_AIP_LINE2: + case TM6000_AMUX_ADC1: + case TM6000_AMUX_ADC2: tm6010_set_mute_adc(dev, mute); break; default: @@ -765,7 +748,6 @@ int tm6000_tvaudio_set_mute(struct tm6000_core *dev, u8 mute) } return 0; } -EXPORT_SYMBOL_GPL(tm6000_tvaudio_set_mute); void tm6010_set_volume_sif(struct tm6000_core *dev, int vol) { @@ -797,17 +779,17 @@ void tm6010_set_volume_adc(struct tm6000_core *dev, int vol) void tm6000_set_volume(struct tm6000_core *dev, int vol) { - enum tm6000_inaudio ainp; + enum tm6000_mux mux; if (dev->radio) { - ainp = dev->aradio; + mux = dev->rinput.amux; vol += 8; /* Offset to 0 dB */ } else - ainp = dev->avideo; + mux = dev->vinput[dev->input].amux; - switch (ainp) { - case TM6000_AIP_SIF1: - case TM6000_AIP_SIF2: + switch (mux) { + case TM6000_AMUX_SIF1: + case TM6000_AMUX_SIF2: if (dev->dev_type == TM6010) tm6010_set_volume_sif(dev, vol); else @@ -815,15 +797,14 @@ void tm6000_set_volume(struct tm6000_core *dev, int vol) " SIF audio inputs. Please check the %s" " configuration.\n", dev->name); break; - case TM6000_AIP_LINE1: - case TM6000_AIP_LINE2: + case TM6000_AMUX_ADC1: + case TM6000_AMUX_ADC2: tm6010_set_volume_adc(dev, vol); break; default: break; } } -EXPORT_SYMBOL_GPL(tm6000_set_volume); static LIST_HEAD(tm6000_devlist); static DEFINE_MUTEX(tm6000_devlist_mutex); diff --git a/drivers/staging/tm6000/tm6000-i2c.c b/drivers/staging/tm6000/tm6000-i2c.c index 18de4748f27e..8828c120b5ca 100644 --- a/drivers/staging/tm6000/tm6000-i2c.c +++ b/drivers/staging/tm6000/tm6000-i2c.c @@ -237,35 +237,36 @@ err: return rc; } -static int tm6000_i2c_eeprom(struct tm6000_core *dev, - unsigned char *eedata, int len) +static int tm6000_i2c_eeprom(struct tm6000_core *dev) { int i, rc; - unsigned char *p = eedata; + unsigned char *p = dev->eedata; unsigned char bytes[17]; dev->i2c_client.addr = 0xa0 >> 1; + dev->eedata_size = 0; bytes[16] = '\0'; - for (i = 0; i < len; ) { - *p = i; - rc = tm6000_i2c_recv_regs(dev, 0xa0, i, p, 1); + for (i = 0; i < sizeof(dev->eedata); ) { + *p = i; + rc = tm6000_i2c_recv_regs(dev, 0xa0, i, p, 1); if (rc < 1) { - if (p == eedata) + if (p == dev->eedata) goto noeeprom; else { printk(KERN_WARNING "%s: i2c eeprom read error (err=%d)\n", dev->name, rc); } - return -1; + return -EINVAL; } + dev->eedata_size++; p++; if (0 == (i % 16)) printk(KERN_INFO "%s: i2c eeprom %02x:", dev->name, i); - printk(" %02x", eedata[i]); - if ((eedata[i] >= ' ') && (eedata[i] <= 'z')) - bytes[i%16] = eedata[i]; + printk(" %02x", dev->eedata[i]); + if ((dev->eedata[i] >= ' ') && (dev->eedata[i] <= 'z')) + bytes[i%16] = dev->eedata[i]; else bytes[i%16] = '.'; @@ -280,15 +281,15 @@ static int tm6000_i2c_eeprom(struct tm6000_core *dev, bytes[i%16] = '\0'; for (i %= 16; i < 16; i++) printk(" "); + printk(" %s\n", bytes); } - printk(" %s\n", bytes); return 0; noeeprom: printk(KERN_INFO "%s: Huh, no eeprom present (err=%d)?\n", - dev->name, rc); - return rc; + dev->name, rc); + return -EINVAL; } /* ----------------------------------------------------------- */ @@ -314,7 +315,6 @@ static const struct i2c_algorithm tm6000_algo = { */ int tm6000_i2c_register(struct tm6000_core *dev) { - unsigned char eedata[256]; int rc; dev->i2c_adap.owner = THIS_MODULE; @@ -329,8 +329,7 @@ int tm6000_i2c_register(struct tm6000_core *dev) dev->i2c_client.adapter = &dev->i2c_adap; strlcpy(dev->i2c_client.name, "tm6000 internal", I2C_NAME_SIZE); - - tm6000_i2c_eeprom(dev, eedata, sizeof(eedata)); + tm6000_i2c_eeprom(dev); return 0; } diff --git a/drivers/staging/tm6000/tm6000-stds.c b/drivers/staging/tm6000/tm6000-stds.c index da3e51bde109..8b29d732ddcb 100644 --- a/drivers/staging/tm6000/tm6000-stds.c +++ b/drivers/staging/tm6000/tm6000- |