v4l: cx88 driver update
PATCH 1/1 v4l: cx88 driver update
Hi,
This is a update for the cx88 tv card driver. Changes:
* finally make it build with gcc 2.95 ;)
* add new tv cards.
* plenty of fixes for the TV sound code.
* use v4l2 API for communication with tuner + tda9887
* misc other minor stuff.
please apply,
Gerd
drivers/media/video/cx88/cx88-cards.c +164 -16
@@ -99,6 +99,10 @@ struct cx88_board cx88_boards[] = { .input = {{ .type = CX88_VMUX_TELEVISION, .vmux = 0, + .gpio0 = 0x000003ff, + .gpio1 = 0x000000ff, + .gpio2 = 0x000000ff, + .gpio3 = 0x00000000, },{ .type = CX88_VMUX_COMPOSITE1, .vmux = 1,
@@ -111,6 +115,7 @@ struct cx88_board cx88_boards[] = { [CX88_BOARD_WINFAST2000XP] = { .name = "Leadtek Winfast 2000XP Expert", .tuner_type = 44, + .needs_tda9887 = 1, .input = {{ .type = CX88_VMUX_TELEVISION, .vmux = 0,
@@ -149,22 +154,33 @@ struct cx88_board cx88_boards[] = { .vmux = 0, }}, }, - [CX88_BOARD_MSI_TVANYWHERE] = { + [CX88_BOARD_MSI_TVANYWHERE_MASTER] = { +//added gpio values thanks to Torsten Seeboth +//values for PAL from DScaler .name = "MSI TV-@nywhere Master", .tuner_type = 33, + .needs_tda9887 = 1, .input = {{ .type = CX88_VMUX_TELEVISION, .vmux = 0, + .gpio0 = 0x000040bf, + .gpio1 = 0x000080c0, + .gpio2 = 0x0000ff40, + .gpio3 = 0x00000000, },{ .type = CX88_VMUX_COMPOSITE1, .vmux = 1, - },{ -// temporarly for testing ... - .type = CX88_VMUX_COMPOSITE2, - .vmux = 2, + .gpio0 = 0x000040bf, + .gpio1 = 0x000080c0, + .gpio2 = 0x0000ff40, + .gpio3 = 0x00000000, },{ .type = CX88_VMUX_SVIDEO, .vmux = 2, + .gpio0 = 0x000040bf, + .gpio1 = 0x000080c0, + .gpio2 = 0x0000ff40, + .gpio3 = 0x00000000, }}, .radio = { .type = CX88_RADIO,
@@ -199,8 +215,97 @@ struct cx88_board cx88_boards[] = { .type = CX88_RADIO, }, }, - - + [CX88_BOARD_IODATA_GVVCP3PCI ] = { + .name ="IODATA GV-VCP3/PCI" , + .tuner_type =TUNER_ABSENT , + .needs_tda9887 =0 , + .input = {{ + .type =CX88_VMUX_COMPOSITE1 , + .vmux =0 , + },{ + .type =CX88_VMUX_COMPOSITE2 , + .vmux =1 , + },{ + .type =CX88_VMUX_SVIDEO , + .vmux =2 , + }}, + }, + [CX88_BOARD_PROLINK_PLAYTVPVR ] = { + .name ="Prolink PlayTV PVR" , + .tuner_type =43 , + .needs_tda9887 =1 , + .input = {{ + .type =CX88_VMUX_TELEVISION , + .vmux =0 , + .gpio0 =0xff00 , + },{ + .type =CX88_VMUX_COMPOSITE1 , + .vmux =1 , + .gpio0 =0xff03 , + },{ + .type =CX88_VMUX_SVIDEO , + .vmux =2 , + .gpio0 =0xff03 , + }}, + .radio = { + .type =CX88_RADIO , + .gpio0 =0xff00 , + }, + }, + [CX88_BOARD_ASUS_PVR_416 ] = { + .name ="ASUS PVR-416" , + .tuner_type =43 , + .needs_tda9887 =1 , + .input = {{ + .type =CX88_VMUX_TELEVISION , + .vmux =0 , + .gpio0 =0x0000fde6 , + .gpio1 =0x00000000 ,// possibly for mpeg data + .gpio2 =0x000000e9 , + .gpio3 =0x00000000 , + },{ + .type =CX88_VMUX_SVIDEO , + .vmux =2 , + .gpio0 =0x0000fde6 ,// 0x0000fda6 L,R RCA audio in? + .gpio1 =0x00000000 ,// possibly for mpeg data + .gpio2 =0x000000e9 , + .gpio3 =0x00000000 , + }}, + .radio = { + .type =CX88_RADIO , + .gpio0 =0x0000fde2 , + .gpio1 =0x00000000 , + .gpio2 =0x000000e9 , + .gpio3 =0x00000000 , + }, + }, + [CX88_BOARD_MSI_TVANYWHERE ] = { + .name ="MSI TV-@nywhere" , + .tuner_type =33 , + .needs_tda9887 =1 , + .input = {{ + .type =CX88_VMUX_TELEVISION , + .vmux =0 , + .gpio0 =0x00000fbf , + .gpio1 =0x000000c0 , + .gpio2 =0x0000fc08 , + .gpio3 =0x00000000 , + },{ + .type =CX88_VMUX_COMPOSITE1 , + .vmux =1 , + .gpio0 =0x00000fbf , + .gpio1 =0x000000c0 , + .gpio2 =0x0000fc68 , + .gpio3 =0x00000000 , + },{ + .type =CX88_VMUX_SVIDEO , + .vmux =2 , + .gpio0 =0x00000fbf , + .gpio1 =0x000000c0 , + .gpio2 =0x0000fc68 , + .gpio3 =0x00000000 , + }}, + }, };const unsigned int cx88_bcount =ARRAY_SIZE (cx88_boards);
@@ -242,6 +347,10 @@ struct cx88_subid cx88_subids[] = { .card = CX88_BOARD_WINFAST_DV2000, },{ .subvendor = 0x107d, + .subdevice = 0x663b, + .card = CX88_BOARD_LEADTEK_PVR2000, + },{ + .subvendor = 0x107d, .subdevice = 0x663C, .card = CX88_BOARD_LEADTEK_PVR2000, },{
@@ -251,12 +360,19 @@ struct cx88_subid cx88_subids[] = { },{ .subvendor = 0x1462, .subdevice = 0x8606, - .card = CX88_BOARD_MSI_TVANYWHERE, - } + .card = CX88_BOARD_MSI_TVANYWHERE_MASTER, + },{ + .subvendor = 0x10fc, + .subdevice = 0xd003, + .card = CX88_BOARD_IODATA_GVVCP3PCI, + },{ + .subvendor = 0x1043, + .subdevice = 0x4823, /* with mpeg encoder */ + .card = CX88_BOARD_ASUS_PVR_416, + } };const unsigned int cx88_idcount =ARRAY_SIZE (cx88_subids); -/* ----------------------------------------------------------------------- */ /* some leadtek specific stuff */
@@ -269,7 +385,7 @@ static void __devinit leadtek_eeprom(str*/ if (eeprom_data[4 ] !=0x7d || - eeprom_data[5 ] !=0x10 || + eeprom_data[5 ] !=0x10 || eeprom_data[7 ] !=0x66 ) {printk (KERN_WARNING "%s Leadtek eeprom invalid.\n" , dev->name);return ;
@@ -277,7 +393,7 @@ static void __devinit leadtek_eeprom(str dev->has_radio =1 ; dev->tuner_type = (eeprom_data[6 ] ==0x13 ) ?43 :38 ; - +printk (KERN_INFO "%s: Leadtek Winfast 2000 XP config: " "tuner=%d, eeprom[0]=0x%02x\n" , dev->name, dev->tuner_type, eeprom_data[0 ]);
@@ -386,20 +502,22 @@ static struct { [ 0x02 ] = { .id = TUNER_ABSENT, .name = "PAL_B" }, [ 0x03 ] = { .id = TUNER_ABSENT, - .name = "BAL_I" }, + .name = "PAL_I" }, [ 0x04 ] = { .id = TUNER_ABSENT, .name = "PAL_D" }, [ 0x05 ] = { .id = TUNER_ABSENT, .name = "SECAM" }, - [ 0x10 ] = { .id = TUNER_ABSENT, .fm = 1, + [ 0x10 ] = { .id = TUNER_ABSENT, + .fm = 1, .name = "TEMIC_4049" }, [ 0x11 ] = { .id = TUNER_TEMIC_4136FY5, .name = "TEMIC_4136" }, [ 0x12 ] = { .id = TUNER_ABSENT, .name = "TEMIC_4146" }, - [ 0x20 ] = { .id = TUNER_PHILIPS_FQ1216ME, .fm = 1, + [ 0x20 ] = { .id = TUNER_PHILIPS_FQ1216ME, + .fm = 1, .name = "PHILIPS_FQ1216_MK3" }, [ 0x21 ] = { .id = TUNER_ABSENT, .fm = 1, .name = "PHILIPS_FQ1236_MK3" },
@@ -454,7 +572,33 @@ i2c_eeprom(struct i2c_client *c, unsignereturn 0 ; } -void __devinit cx88_card_setup (struct cx8800_dev *dev) +void cx88_card_list (struct cx8800_dev *dev) +{ +int i; + +if (0 == dev->pci->subsystem_vendor && +0 == dev->pci->subsystem_device) { +printk ("%s: Your board has no valid PCI Subsystem ID and thus can't\n" +"%s: be autodetected. Please pass card=<n> insmod option to\n" +"%s: workaround that. Redirect complaints to the vendor of\n" +"%s: the TV card. Best regards,\n" +"%s: -- tux\n" , + dev->name,dev->name,dev->name,dev->name,dev->name); + }else { +printk ("%s: Your board isn't known (yet) to the driver. You can\n" +"%s: try to pick one of the existing card configs via\n" +"%s: card=<n> insmod option. Updating to the latest\n" +"%s: version might help as well.\n" , + dev->name,dev->name,dev->name,dev->name); + } +printk ("%s: Here is a list of valid choices for the card=<n> insmod option:\n" , + dev->name); +for (i =0 ; i < cx88_bcount; i++) +printk ("%s: card=%d -> %s\n" , + dev->name, i, cx88_boards[i].name); +} + +void cx88_card_setup (struct cx8800_dev *dev) {static u8 eeprom[128 ];
@@ -474,6 +618,9 @@ void __devinit cx88_card_setup(struct cxi2c_eeprom (&dev->i2c_client,eeprom,sizeof (eeprom));leadtek_eeprom (dev,eeprom);break ; +case CX88_BOARD_ASUS_PVR_416 : + dev->has_radio =1 ; +break ; } }
@@ -483,6 +630,7 @@ EXPORT_SYMBOL(cx88_boards);EXPORT_SYMBOL (cx88_bcount);EXPORT_SYMBOL (cx88_subids);EXPORT_SYMBOL (cx88_idcount); +EXPORT_SYMBOL (cx88_card_list);EXPORT_SYMBOL (cx88_card_setup);/*
drivers/media/video/cx88/cx88-i2c.c +0 -2
@@ -22,8 +22,6 @@*/ -#define __NO_VERSION__ 1 -#include <linux/module.h> #include <linux/init.h>
drivers/media/video/cx88/cx88-reg.h +10 -0
@@ -599,10 +599,20 @@#define EN_I2SIN_STR2DAC 0x00004000#define EN_I2SIN_ENABLE 0x00008000 +#if 0 +/* old */ #define EN_DMTRX_SUMDIFF 0x00000800#define EN_DMTRX_SUMR 0x00000880#define EN_DMTRX_LR 0x00000900#define EN_DMTRX_MONO 0x00000980 +#else +/* dscaler cvs */ +#define EN_DMTRX_SUMDIFF (0 << 7) +#define EN_DMTRX_SUMR (1 << 7) +#define EN_DMTRX_LR (2 << 7) +#define EN_DMTRX_MONO (3 << 7) +#define EN_DMTRX_BYPASS (1 << 11) +#endif // Video #define VID_CAPTURE_CONTROL 0x310180
drivers/media/video/cx88/cx88-tvaudio.c +334 -251
702 lines not on this page · raw message
drivers/media/video/cx88/cx88-vbi.c +10 -13
@@ -28,17 +28,14 @@ void cx8800_vbi_fmt(struct cx8800_dev *d f->fmt.vbi.count[0 ] =VBI_LINE_COUNT ; f->fmt.vbi.count[1 ] =VBI_LINE_COUNT ; -switch (dev->tvnorm->id) { -case V4L2_STD_NTSC_M : -case V4L2_STD_NTSC_M_JP : +if (dev->tvnorm->id &V4L2_STD_525_60 ) { +/* ntsc */ f->fmt.vbi.sampling_rate =28636363 ; f->fmt.vbi.start[0 ] =10 -1 ; f->fmt.vbi.start[1 ] =273 -1 ; -break ; -case V4L2_STD_PAL_BG : -case V4L2_STD_PAL_DK : -case V4L2_STD_PAL_I : -case V4L2_STD_SECAM : + + }else if (V4L2_STD_625_50 ) { +/* pal */ f->fmt.vbi.sampling_rate =35468950 ; f->fmt.vbi.start[0 ] =7 -1 ; f->fmt.vbi.start[1 ] =319 -1 ;
@@ -64,10 +61,10 @@ int cx8800_start_vbi_dma(struct cx8800_d/* enable irqs */ cx_set (MO_PCI_INTMSK ,0x00fc01 );cx_set (MO_VID_INTMSK ,0x0f0088 ); - +/* enable capture */ cx_set (VID_CAPTURE_CONTROL ,0x18 ); - +/* start dma */ cx_set (MO_DEV_CNTRL2 , (1 <<5 ));cx_set (MO_VID_DMACNTRL ,0x88 );
@@ -80,7 +77,7 @@ int cx8800_restart_vbi_queue(struct cx88 {struct cx88_buffer *buf;struct list_head *item; - +if (list_empty (&q->active))return 0 ;
@@ -104,7 +101,7 @@ void cx8800_vbi_timeout(unsigned long daunsigned long flags;cx88_sram_channel_dump (dev, &cx88_sram_channels[SRAM_CH24 ]); - +cx_clear (MO_VID_DMACNTRL ,0x88 );cx_clear (VID_CAPTURE_CONTROL ,0x18 );
@@ -161,7 +158,7 @@ vbi_prepare(struct file *file, struct vicx88_risc_buffer (dev->pci, &buf->risc, buf->vb.dma.sglist,0 , buf->vb.width * buf->vb.height, - buf->vb.width,0 , + buf->vb.width,0 , buf->vb.height); } buf->vb.state =STATE_PREPARED ;
drivers/media/video/cx88/cx88-video.c +101 -78
454 lines not on this page · raw message
drivers/media/video/cx88/cx88.h +21 -13
@@ -32,7 +32,7 @@#include "cx88-reg.h" #include <linux/version.h> -#define CX88_VERSION_CODE KERNEL_VERSION(0,0,3) +#define CX88_VERSION_CODE KERNEL_VERSION(0,0,4)#ifndef TRUE # define TRUE (1==1)
@@ -114,17 +114,20 @@ extern struct sram_channel cx88_sram_cha/* card configuration */ #define CX88_BOARD_NOAUTO UNSET -#define CX88_BOARD_UNKNOWN 0 -#define CX88_BOARD_HAUPPAUGE 1 -#define CX88_BOARD_GDI 2 -#define CX88_BOARD_PIXELVIEW 3 -#define CX88_BOARD_ATI_WONDER_PRO 4 -#define CX88_BOARD_WINFAST2000XP 5 -#define CX88_BOARD_AVERTV_303 6 -#define CX88_BOARD_MSI_TVANYWHERE 7 -#define CX88_BOARD_WINFAST_DV2000 8 -#define CX88_BOARD_LEADTEK_PVR2000 9 - +#define CX88_BOARD_UNKNOWN 0 +#define CX88_BOARD_HAUPPAUGE 1 +#define CX88_BOARD_GDI 2 +#define CX88_BOARD_PIXELVIEW 3 +#define CX88_BOARD_ATI_WONDER_PRO 4 +#define CX88_BOARD_WINFAST2000XP 5 +#define CX88_BOARD_AVERTV_303 6 +#define CX88_BOARD_MSI_TVANYWHERE_MASTER 7 +#define CX88_BOARD_WINFAST_DV2000 8 +#define CX88_BOARD_LEADTEK_PVR2000 9 +#define CX88_BOARD_IODATA_GVVCP3PCI 10 +#define CX88_BOARD_PROLINK_PLAYTVPVR 11 +#define CX88_BOARD_ASUS_PVR_416 12 +#define CX88_BOARD_MSI_TVANYWHERE 13enum cx88_itype {CX88_VMUX_COMPOSITE1 =1 ,
@@ -263,6 +266,9 @@ struct cx8800_dev {/* other global state info */ u32 shadow[SHADOW_MAX ]; +int shutdown; +pid_t tpid; +struct completion texit;struct cx8800_suspend_state state; };
@@ -351,7 +357,8 @@ extern const unsigned int cx88_bcount;extern struct cx88_subid cx88_subids[];extern const unsigned int cx88_idcount; -extern void __devinit cx88_card_setup (struct cx8800_dev *dev); +extern void cx88_card_list (struct cx8800_dev *dev); +extern void cx88_card_setup (struct cx8800_dev *dev);/* ----------------------------------------------------------- */ /* cx88-tvaudio.c */
@@ -372,6 +379,7 @@ extern void __devinit cx88_card_setup(stvoid cx88_set_tvaudio (struct cx8800_dev *dev);void cx88_get_stereo (struct cx8800_dev *dev,struct v4l2_tuner *t);void cx88_set_stereo (struct cx8800_dev *dev,u32 mode); +int cx88_audio_thread (void *data);/* * Local variables:
Signature · 1 line
Smoking Crack Organization